R 防止闪亮应用程序中断while循环

R 防止闪亮应用程序中断while循环,r,while-loop,shiny,R,While Loop,Shiny,我正在尝试在一个while循环中运行一个闪亮的应用程序。退出应用程序时,while循环中断。有没有办法在退出应用程序时保持在循环中 下面是一个问题的例子。app.R文件是在创建新应用程序时创建的应用程序 library(shiny) x <- 1 while(x<=5){ runApp("app.R") x <- x+1 } 库(闪亮) 停止闪亮应用程序的“标准”方法是简单地停止为其服务的R进程。你需要一种在不中断的情况下关闭应用程序的方法。stopApp(

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

下面是一个问题的例子。app.R文件是在创建新应用程序时创建的应用程序

library(shiny)

x <- 1

while(x<=5){

  runApp("app.R")

  x <- x+1

}
库(闪亮)
停止闪亮应用程序的“标准”方法是简单地停止为其服务的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
}
重要的是让你的用户明白他们需要在应用程序中使用你的“关闭”按钮,而不是关闭浏览器窗口或使用RStudio中的“停止”按钮。这些动作中的任何一个都会中断主脚本


编辑以添加:
实际上,在
{shiny}
中内置了一些函数,用于监听用户会话的结束(即关闭浏览器窗口)、
onStop()
onsessionend()
。您应该查看它们的帮助页面,但是将我的
observeEvent(…)
行替换为
onStop(stopap)
(或
onsessionend(stopap)
)似乎效果不错。然后您可以从UI中删除关闭按钮。

是否
runApp(“app.R”)
产生错误?如果是这样,您需要捕获错误,可以使用
try
tryCatch
。没有错误,它只是退出while循环。我尝试了
tryCatch()
suppressMessages()
,但它仍然打破了循环。(
suppressMessages
只防止消息转储到控制台,对程序流没有任何作用。)
x <- 1
while (x <= 5) {
  user_input <- runApp(<code from above>)
  x <- x+1
}