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

时间:2017-05-02 10:40:10

标签: r for-loop shiny

我正在寻找一种解决方案,我们可以在R shine中打印单次迭代输出。现在,当For循环结束它的工作时,我得到了输出(一堆文本输出)。有没有办法从for循环中将itrative输出打印到R shiny mainpanel?

编辑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)

1 个答案:

答案 0 :(得分:0)

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

保持输出和生成分开。当无功值发生变化时,输出元素将触发重新显示,但只要它不修改任何变量,就不会导致奇数循环发生。

这是我最初尝试的一个例子,它没有正常工作:

## 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 Purpose\n", i);
       Sys.sleep(0.2);
     }
   })
}

此代码一次性输出修改后的信息,而不是更新它。

我认为问题很可能是Shiny正在等待函数的结束来检查被动触发器。这是因为,尽管有外观,Shiny并不是并行运行。让两件事迭代工作的唯一方法是打破函数,允许其他函数运行,然后恢复函数。这是Google groups link中提到的过程。

该链接中的第一个实现是有效的,因为定时器设置为以一秒的间隔运行该函数的一次迭代。这是一个替代实现,其中迭代函数仅在按下按钮时[一次]更新:

## 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方法很有趣,因为它在方法的中间创建了一个单独的显示循环。我可以想象,如果在整个地方使用这种方法,那么闪亮的代码变得不那么简单和可预测。