【问题标题】:Prevent shiny app from breaking a while loop防止闪亮的应用程序打破while循环
【发布时间】:2020-06-02 17:25:39
【问题描述】:

我正在尝试在一个 while 循环中运行一个闪亮的应用程序。退出应用程序后,while 循环中断。有没有办法在退出应用程序时留在循环中?

这是一个问题的例子。 app.R 文件是在创建新的闪亮应用时创建的应用。

library(shiny)

x <- 1

while(x<=5){

  runApp("app.R")

  x <- x+1

}

【问题讨论】:

  • runApp("app.R") 是否产生错误?如果是这样,您需要捕获错误,可能使用trytryCatch
  • 没有错误,它只是退出了while循环。我已经尝试过tryCatch()suppressMessages(),但它仍然会中断循环。
  • suppressMessages 只是防止消息被转储到控制台,它对程序流没有任何作用。)

标签: r while-loop shiny


【解决方案1】:

停止 Shiny 应用程序的“标准”方法是简单地停止为其提供服务的 R 进程。您需要一种在不中断的情况下关闭应用程序的方法。 stopApp() 函数会执行此操作,将线程的控制权返回给脚本的主流程。

此示例来自?runApp 的帮助页面,我在下面添加了两个注释。

library(shiny)

x <- 1
while (x <= 5) {
  runApp(list(
    ui = bootstrapPage(
      numericInput('n', 'Number of obs', 100),
      plotOutput('plot'),
      actionButton("done", "close")         # added a close button
    ),
    server = function(input, output) {
      output$plot <- renderPlot({ hist(runif(input$n)) })
      observeEvent(input$done, stopApp())   # added an observer to the close button
    }
  ))
  x <- x+1
}

您还可以在stopApp() 中放入来自 Shiny 应用程序逻辑的参数,以便您可以在其他计算中使用结果。在这个例子中,如果我们想知道n 的用户输入,我们可以使用stopApp(input$n),整个应用程序将返回该值,如下所示。

x <- 1
while (x <= 5) {
  user_input <- runApp(<code from above>)
  x <- x+1
}

重要的是让您的用户明白他们需要在应用程序中使用您的“关闭”按钮,而不是关闭浏览器窗口或使用 RStudio 中的“停止”按钮。这些操作中的任何一个都会中断您的主脚本。


编辑添加:

实际上{shiny} 内置了一些函数来监听用户的会话结束(即关闭浏览器窗口),onStop()onSessionEnded()。您应该查看他们的帮助页面,但是用onStop(stopApp)(或onSessionEnded(stopApp))替换我的observeEvent(...) 行似乎工作得很好。然后您可以从 UI 中移除关闭按钮。

【讨论】:

    猜你喜欢
    • 2020-09-21
    • 2019-07-02
    • 2020-03-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-03-23
    相关资源
    最近更新 更多