闪亮服务器 - 如何使用 session$onSessionEnded()

Shiny Server - how to use session$onSessionEnded()

我正在尝试跟踪用户 activity 使用我闪亮的应用程序时的情况。我在特定位置放置了函数,这些函数将行写入临时文件。我想要的是有一个在用户会话结束时调用的函数。

根据文档:

> ?session
> onSessionEnded(callback)  
      Registers a function to be called after the client has disconnected. Returns a function that can be called with no arguments to cancel the registration.

我试过用这个:

session$onSessionEnded(function(x){
  a = read_csv(shinyActivityTmpFile_000)
  write_csv(a,'C:\Users\xxxx\Desktop\test.csv')
})

但是什么也没发生。 shinyActivityTmpFile_000 是全局文件引用。当用户单击按钮并执行操作时,应用程序会以 CSV 格式写入此文件。我只是想将它从临时存储移动到永久存储。最终我想要将它写入数据库的函数,但为了测试我只是想获得一个函数,该函数将在应用程序关闭时 运行。

我在这里错过了什么?

你好,我不知道你是如何构建 shinyActivityTmpFile 文件的,但是对于使用 onSessionEnded 你可以看看这个例子,它在文件中写入应用程序启动的日期时间,当应用程序关闭时:

library("shiny")
ui <- fluidPage(
  "Nothing here"
)
server <- function(input, output, session) {
  # This code will be run once per user
  users_data <- data.frame(START = Sys.time())

  # This code will be run after the client has disconnected
  session$onSessionEnded(function() {
    users_data$END <- Sys.time()
    # Write a file in your working directory
    write.table(x = users_data, file = file.path(getwd(), "users_data.txt"),
                append = TRUE, row.names = FALSE, col.names = FALSE, sep = "\t")
  })
}
shinyApp(ui = ui, server = server)

如果您使用带身份验证的服务器,您可以通过以下方式检索用户名:

users_data <- data.frame(USERS = session$user, START = Sys.time())

基于@Victorp 的回答和对 session$onSessionEnded 参数的评论的回复。可以使用默认参数向函数添加参数:

server <- function(input, output, session) {
  # This code will be run once per user
  users_data <- data.frame(USERS = session$user, START = Sys.time())

  # This code will be run after the client has disconnected
  session$onSessionEnded(function(userID = users_data$USERS) {
      if(userID==1){
          users_data$END <- Sys.time()
          # Write a file in your working directory
          write.table(x = users_data, file = file.path(getwd(), "users_data.txt"),
                      append = TRUE, row.names = FALSE, col.names = FALSE, sep = "\t")
      }
  })
}
shinyApp(ui = ui, server = server)