如何区分应用程序崩溃和用户关闭

bob*_*bel 5 r shiny

我想根据用户关闭应用程序还是应用程序崩溃来有条件地运行代码。

session$onSessionEnded无论会话如何结束,都会运行。而且我没有在里面找到一些其他函数或变量session,看起来它可能是会话如何结束的指示器。

基本上我想使用类似于下面示例应用程序中注释代码的东西。crashed如果我单击按钮会打印在哪里,但user ended如果我关闭应用程序(例如,关闭浏览器)会打印。

library(shiny)
ui <- fluidPage(actionButton('crash', 'crash me'))
server <- function(input, output, session){
  observeEvent(input$crash, stop())
  session$onSessionEnded(function() {
    # if (crashed){
    #   print('crashed')
    # }else{
    #   print('user ended')
    # }
  })
}
shinyApp(ui, server)
Run Code Online (Sandbox Code Playgroud)

Wal*_*ldi 4

您可以使用shiny.error选项来定义自定义错误处理程序。

尝试:

library(shiny)

ui <- fluidPage(actionButton('crash', 'crash me'))

errorfn <- function() {crashed <<- T }
options(shiny.error = errorfn)
crashed <- F

server <- function(input, output, session){

  session$userData$starttime <- Sys.time()
  observeEvent(input$crash, stop())
  session$onSessionEnded(function() {
    if (crashed) print(paste("Started at :",session$userData$starttime, " - Crashed at : " , Sys.time())) else print("Not crashed, ended by user")
    stopApp(crashed)
    crashed <<- F
  })
}
runApp(list(ui=ui, server=server))

[1] "Started at : 2020-09-15 17:27:41  - Crashed at :  2020-09-15 17:27:45"
[1] TRUE
Run Code Online (Sandbox Code Playgroud)