R 会话结束时的事件计时

R 会话结束时的事件计时,r,shiny,R,Shiny,我正在构建一个闪亮的应用程序,当客户端关闭时,我想在其中停止(本地)服务器。实现这一点的简单方法是将其包括在shinyServer功能中: session$onSessionEnded(function() { stopApp() }) 这种方法的一个缺点是,如果用户决定点击刷新,那么应用程序就会死亡 我尝试了各种解决方法,例如使用反应计时器/无效计时器以一定的间隔检查连接。但是,它们采用会话引用(它们特定于会话),因此在会话结束后不会执行任何操作 有没有一种方法可以让“全局”服务器计

我正在构建一个闪亮的应用程序,当客户端关闭时,我想在其中停止(本地)服务器。实现这一点的简单方法是将其包括在
shinyServer
功能中:

session$onSessionEnded(function() {
    stopApp()
})
这种方法的一个缺点是,如果用户决定点击刷新,那么应用程序就会死亡

我尝试了各种解决方法,例如使用
反应计时器
/
无效计时器
以一定的间隔检查连接。但是,它们采用会话引用(它们特定于会话),因此在会话结束后不会执行任何操作


有没有一种方法可以让“全局”服务器计时器定期执行,并检查活动连接?或者另一种实现自动关闭应用程序但允许刷新页面的方法?

您可以在服务器上添加一个
操作按钮和一些代码,以便在单击按钮时停止应用程序。例如:

runApp(list(
  ui = bootstrapPage(
    actionButton('close', "Close app")
  ),
  server = function(input, output) {
    observe({
      if (input$close > 0) stopApp()
    })
  }
))
但是,这不会自动关闭浏览器窗口(除非您正在使用RStudio的内置浏览器窗口进行查看)。为此,需要向actionButton添加一些Javascript

runApp(list(
  ui = bootstrapPage(
    tags$button(
      id = 'close',
      type = "button",
      class = "btn action-button",
      onclick = "setTimeout(function(){window.close();},500);",
      "Close window"
    )
  ),
  server = function(input, output) {
    observe({
      if (input$close > 0) stopApp()
    })
  }
))

当然,这不会在用户以其他方式关闭窗口时停止应用程序。我相信也可以在浏览器中检测窗口关闭事件,然后您可以设置一个输入值(发送到服务器),但我不知道它是否会在窗口关闭之前进入服务器,JavaScript停止运行。

好的问题可能是RStudio的一个用户将有一个关于如何执行的句柄,是的,我确实考虑了这个解决方案;但这样做的主要原因是(一些)用户有刷新页面和使用关闭按钮关闭窗口的习惯。两者都很难处理。因此,它不是作为一个功能,更多的是作为一个“守卫”。。。服务器作为小型本地(便携式)R运行,对用户隐藏。客户端是一个可移植的chrome。当它关闭时,服务器应该自动停止并很好地退出。但如果用户刷新“页面”,则不会。当我在R控制台中运行第一个代码块时,它会停止应用程序。当我运行第二个代码块时,我让它关闭浏览器选项卡;但它不会停止应用程序。建议?