如何从 R shinyapp 中的"for"循环获取迭代输出?



我正在寻找一个解决方案,在该解决方案中,我们可以在R Shiny中打印单个迭代输出。现在,当循环结束其工作时,我得到了输出(一堆文本输出(。有什么方法可以将Itrative输出从循环中闪闪发亮的主台层?

编辑1.这是一个示例代码,由于官方原因,我无法共享原始代码。希望它有帮助。

library(shiny)
library(shinydashboard)
library(shinythemes)
ui <- dashboardPage(
dashboardHeader(title = "LAP"),
dashboardSidebar( 
sidebarMenu(
  #menuItem("Introduction", tabName = "intro", icon = icon("info-circle")),
  menuItem("test", tabName = "FD", icon = icon("info-circle"))
)),
dashboardBody(
tabItems(
  tabItem(tabName = "FD",
          fluidRow(
            box(verbatimTextOutput("loc") )))
  )
 )
)
 server =shinyServer(function(input, output){
 mydata<- reactive({
for(i in 1:100){
  print("For Demo Purpose")
}
})
output$loc<- renderPrint({
mydata()
}) 
})
shinyApp(ui= ui, server = server)

我能想到的最简单方法是使用迭代函数附加到反应性变量,并在另一个输出元素中显示该变量。

只要将输出和生成分开即可。当反应值更改时,输出元素将触发重新播放,但只要不修改任何变量,就不会导致奇数循环。

这是我在一个示例中的初步尝试,该尝试无法正常工作:

## stub UI with an activation button and text output element
ui <- fluidPage(
   titlePanel("Iterative output demo"),
   sidebarLayout(
      sidebarPanel(
        actionButton("start","Start Program")
      ),
      mainPanel(
         textOutput("showProgressText")
      )
   )
)
## server stub
server <- function(input, output) {
   ## reactive list to store result values
   iterativeOutput <- reactiveValues();
   ## text rendering function `showProgressText`
   output$showProgressText <- renderText({
     sapply(iterativeOutput,paste);
   })
   ## iterative function; modifies the reactive list on each iteration
   observeEvent(input$start,{
     iterativeOutput <- reactiveValues(); # clear list
     for(i in 1:10){
       iterativeOutput[[as.character(i)]] <- 
         sprintf("%2d: For Demo Purposen", i);
       Sys.sleep(0.2);
     }
   })
}

此代码将修改的信息全部输出,而不是更新。

我认为问题可能是Shiny正在等待功能的结束,以检查反应性触发器。这是因为,尽管出现了光泽,但Shiny并未并行进行操作。迭代工作两件事的唯一方法是打破功能,允许其他功能运行,然后恢复功能。这是Google组链接中提到的过程。

该链接中的第一个实现作用是因为设置了一个计时器以在一秒钟的时间间隔内运行函数的一个迭代。这是一个替代实现,当按下按钮时,迭代函数仅更新[一次]:

## UI stub
ui <- fluidPage(
   titlePanel("Iterative output demo"),
   sidebarLayout(
      sidebarPanel(
        actionButton("start","Start Program")
      ),
      mainPanel(
         htmlOutput("showProgressText")
      )
   )
)
## Server stub
server <- function(input, output) {
   iterativeOutput <- reactiveValues();
   output$showProgressText <- renderText(
       paste0(sapply(reactiveValuesToList(iterativeOutput),paste), 
              collapse="<br />n")
   )
   observeEvent(input$start,{
     #iterativeOutput <- reactiveValues(); # clear list
     i <- (input$start-1) %% 10;
     iterativeOutput[[as.character(i)]] <- 
       sprintf("%2d: %d", i, sample.int(1000, 1));
   })
}

insertUI方法很有趣,因为它在方法中间创建了一个单独的显示循环。我可以想象,如果在整个地方都使用该方法,那么闪亮的代码变得不那么简单和可预测。

最新更新