2015-09-27 148 views
2

我的闪亮应用必须执行一些稍慢的服务器端计算,所以我希望用户能够跟踪他们在等待时发生的事情。这里是我的应用程序的结构的一个小例子:R shiny - observeEvent - 使命令按时间顺序执行

https://gist.github.com/0bb9efb98b0a5e431a8f

runGist("0bb9efb98b0a5e431a8f") 

我想发生的事情是:

  1. 点击提交
  2. 的应用程序移动到“输出'标签面板
  3. 它按照它们在observeEvent
  4. 中列出的顺序显示消息和输出

实际发生的是:

  1. 点击提交
  2. 一切都执行服务器端一次
  3. 的UI在年底

更新,是否有可能得到什么我想在这里?

回答

2

我无法用你的方法想出一个解决方案。 Shiny似乎要等到server = function(input, output)中的所有内容都计算完毕,并且在output$...的所有组件都可用时才显示结果。我不知道是否有办法解决这个问题。

然而有一个解决方案来实现,你可以尝试:用你的代码Progress indicators

实现:

library(shiny) 

shinyApp(
    ui = navbarPage(title="test", id="mainNavbarPage", 

        tabPanel("Input", value="tabinput", 
          numericInput('n', 'Number of obs', 100), 
          actionButton(inputId="submit_button", label="Submit") 
       ), 

        tabPanel("Output", value="taboutput", 
          plotOutput('plot') 
       ) 
), 
    server = function(input, output, session) { 


    observeEvent(input$submit_button, { 
     # Move to results page 
     updateNavbarPage(session, "mainNavbarPage", selected="taboutput") 

     withProgress(message = "Computing results", detail = "fetching data", value = 0, { 

     Sys.sleep(3) 

     incProgress(0.25, detail = "computing results") 

     # Perform lots of calculations that may take some time 
     Sys.sleep(4) 

     incProgress(0.25, detail = "part two") 

     Sys.sleep(2) 
     incProgress(0.25, detail = "generating plot") 

     Sys.sleep(2) 
     }) 

     output$plot <- renderPlot({hist(runif(input$n)) }) 

    }) 
}) 
+0

这是一个有用的替代,非常感谢你 – explodecomputer

+0

@explodecomputer欢迎您! –