在循环内更新闪亮输出

时间:2016-11-22 08:41:46

标签: r shiny

现在参考下面的代码,只有在为所有列返回results时才会更新所有verbatimTextOutput框。 我希望UI在每列返回results时显示输出,以指示应用程序确实正在取得进展。 我怎么能这样做?

INPUT_COL = c("V1","V2","V3")

shinyUI(fluidPage(
    sidebarLayout(
        sidebarPanel(
            uiOutput("controls")
        ),


        mainPanel(
          lapply(INPUT_COL, function(self){
            verbatimTextOutput(outputId=paste0("vb.",self))
          })
        )
      )
))


shinyServer(function(input, output,session) {
    output$controls<- renderUI({
        lapply(INPUT_COL, function(self) {
          output[[self]] <- renderUI(...)
          uiOutput(self)
        }) 
    })

    observe({
          params <- sapply(INPUT_COL, function(self) input[[self]])

          lapply(INPUT_COL, function(self) {
            output[[paste0("vb.",self)]] <- renderPrint(
              { tryCatch(
                {
                     results<- getResults(params) #some long process
                     print(results)
                },
                warning=function(war) return(war),
                error=function(err)  return(err) 
                )
              })
          })


      })

}

1 个答案:

答案 0 :(得分:0)

使用计数器

计算出来
status <-reactiveValues(i=0)

shinyServer(function(input, output,session) {
    output$controls<- renderUI({
        lapply(INPUT_COL, function(self) {
          output[[self]] <- renderUI(...)
          uiOutput(self)
        }) 
    })

    observe({
          params <- sapply(INPUT_COL, function(self) input[[self]])
          isolate({
            if (length(params) > 0){
              status$i <- status$i+1
              self <- INPUT_COL[status$i]
              output[[paste0("vb.",self)]] <- renderPrint(
                { tryCatch(
                  {
                       results<- getResults(params) #some long process
                       print(results)
                  },
                  warning=function(war) return(war),
                  error=function(err)  return(err) 
                  )
                })
            }  
          })

          if (isolate(status$i) < length(params)){ 
            invalidateLater(0, session) #reset the observer, so it'll repeat
          }
          else{
            isolate({status$i <- 0}) 
          }


      })

}