获取Shiny以更新ui并在之后运行长计算

时间:2015-12-11 15:18:53

标签: r reactive-programming shiny-server shiny

我一直在尝试实现一个简单的界面来在Shiny上运行R脚本。我希望我的启动应用程序能够了解它对用户所做的事情,我能想象的更简单的事情是向用户说明一些长时间的计算将在实际开始之前启动,到目前为止我找不到方法强制服务器在计算开始之前将更新发送到UI,并且UI被阻塞直到脚本结束。任何人都可以看到一个简单的方法来纠正这个问题,还是我完全改变了解决问题的方式?

感谢您的帮助

server.R

shinyServer(function(input, output, session) {

Exec = reactiveValues(stateTxt = "Not started", state = 0)

output$execStatus = renderText(Exec$stateTxt)
runCalc = function() {
    setwd(root) 
    Exec$stateTxt = "Calculating..."
    source("calc.R")       
    Exec$stateTxt = "Finished"
}

observeEvent(input$runCalc, {runCalc()})
)

ui.R

shinyUI(pageWithSidebar(
      # Application title
  headerPanel("Long Calculation"),

  sidebarPanel(
    actionButton("runCalc", "Run Calculation")
    ),

  mainPanel(verbatimTextOutput("execStatus"))


))

1 个答案:

答案 0 :(得分:0)

不是100%您想要做的事情,但您可以使用'display: none'功能向用户显示注释以进行长时间计算:

withProgress()

这样,您还可以增加进度条,从而提高易用性:

library(shiny)

server <- function(input, output) {
  runCalc = function() {
    withProgress(message = 'Please stand by...', value = 1, {
      Sys.sleep(3)
      output$execStatus <- renderText("Calculation finished")
      })
  }
  observeEvent(input$runCalc, {runCalc()})
  }

ui <- pageWithSidebar(
  headerPanel("Long Calculation"), 
  sidebarPanel(
    actionButton("runCalc", "Run Calculation")
  ),  
  mainPanel(verbatimTextOutput("execStatus"))
)

shinyApp(server=server, ui=ui)