Shiny Server - 如何使用session $ onSessionEnded()

时间:2015-10-20 11:30:27

标签: r shiny shiny-server

我正在尝试跟踪用户活动,因为他们通过我的闪亮应用程序。我将函数放在特定位置,将行写入临时文件。我想要的是拥有一个在用户会话结束时调用的函数。

根据文件:

> ?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格式写入此文件。我只是想把它从临时存储移动到永久存储。最后我希望将函数写入数据库但是为了测试我只是想获得一个在应用程序关闭时运行的函数。

我在这里缺少什么?

2 个答案:

答案 0 :(得分:15)

您好我不知道如何构建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())

答案 1 :(得分:0)

基于@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)