会话结束时的计时事件

时间:2014-07-02 08:31:08

标签: r shiny

我正在构建一个Shiny应用程序,我想在客户端关闭时停止(本地)服务器。实现此目的的一种简单方法是将其包含在shinyServer函数中:

session$onSessionEnded(function() {
    stopApp()
})

这种方法的缺点是如果用户决定点击刷新,那么应用就会死亡。

我尝试了各种解决方法,例如, reactiveTimer / invalidateLater以特定间隔检查连接。但是,它们采用会话引用(它们特定于会话),因此在onSessionEnded之后不执行任何操作。

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

1 个答案:

答案 0 :(得分:4)

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

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()
    })
  }
))

当然,当用户以其他方式关闭窗口时,这不会停止应用程序。我相信它也可以在浏览器中检测窗口关闭事件,然后你可以在那时设置一个输入值(转到服务器),但我不知道它是否& #39;在窗口关闭之前到达服务器并且Javascript停止运行。