Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Shiny Server - how to use session$onSessionEnded()

I'm trying to track user activity as they go through my shiny app. I have functions placed at specific locations which write lines to a temporary file. What I want is to have a function which is called when the user session ends.

According to the documentation:

> ?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.

I tried to use this:

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

But nothing happened. shinyActivityTmpFile_000 is a global file reference. As the user clicks buttons and does stuff, the app is writing out to this file in a CSV format. I'm just trying to move it from temporary storage to permanent storage. Ultimately I'd like the function to write it to a database but for testing I'm just trying to get a function that will run when the app is closed.

What am I missing here?

like image 917
Mark Avatar asked Oct 20 '15 11:10

Mark


People also ask

What does session do in shiny?

Shiny server functions can optionally include session as a parameter (e.g. function(input, output, session) ). The session object is an environment that can be used to access information and functionality relating to the session.

How do you enter shiny data?

To add an input in a Shiny app, we need to place an input function *Input() in the ui object. Each input function requires several arguments. The first two are inputId , an id necessary to access the input value, and label which is the text that appears next to the input in the app.


1 Answers

Hi I don't know how you construct the shinyActivityTmpFile file, but for using onSessionEnded you can look at this exemple, it write in a file the datetime when an app is launched and when the app is closed :

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)

If you use a server with authentication, you can retrieve the username with :

users_data <- data.frame(USERS = session$user, START = Sys.time())
like image 118
Victorp Avatar answered Sep 21 '22 18:09

Victorp