我正在构建一个Shiny应用程序,我想在客户端关闭时停止(本地)服务器.实现此目的的一种简单方法是将其包含在shinyServer
函数中:
session$onSessionEnded(function() {
stopApp()
})
Run Code Online (Sandbox Code Playgroud)
这种方法的缺点是如果用户决定点击刷新,那么应用程序就会死亡.
我已经尝试了各种变通方法,使用eg reactiveTimer
/ invalidateLater
以特定间隔检查连接.但是,它们采用会话引用(它们特定于会话),因此之后不执行任何操作onSessionEnded
.
有没有办法让一个"全局"服务器计时器定期执行,并且可以检查活动连接?或者另一种实现自动应用程序关闭但允许刷新页面的方法?
您可以在服务器上添加actionButton
一些代码,以便在单击按钮时停止应用程序。例如:
runApp(list(
ui = bootstrapPage(
actionButton('close', "Close app")
),
server = function(input, output) {
observe({
if (input$close > 0) stopApp()
})
}
))
Run Code Online (Sandbox Code Playgroud)
但是,这不会自动关闭浏览器窗口(除非您使用 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()
})
}
))
Run Code Online (Sandbox Code Playgroud)
当然,当用户以其他方式关闭窗口时,这不会停止应用程序。我相信也可以在浏览器中检测窗口关闭事件,然后您可以在那时设置一个输入值(该值发送到服务器),但我不知道它是否会到达服务器在窗口关闭并且 Javascript 停止运行之前。
归档时间: |
|
查看次数: |
1263 次 |
最近记录: |