R shiny - observeEvent - 使命令按顺序实时执行

时间:2015-09-27 08:44:27

标签: r shiny

我的闪亮应用程序必须执行一些稍慢的服务器端计算,因此我希望用户能够跟踪他们等待时发生的事情。这是我的应用程序结构的最小示例:

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

runGist("0bb9efb98b0a5e431a8f")

我想要发生的是:

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

    实际发生的是:

    1. 点击提交
    2. 一切都在服务器端执行
    3. 用户界面最后更新
    4. 有可能在这里得到我想要的东西吗?

1 个答案:

答案 0 :(得分: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)) })

    })
})