Estoy tratando de obtener el tiempo del clic de un usuario en una imagen generada dinámicamente usando Shiny y algo de Javascript. La aplicación a continuación informa que la hora del cliente es MÁS TARDE que la hora capturada en el servidor, lo cual no se desea. Me gustaría capturar el tiempo dado por el navegador del usuario cuando hace clic en la imagen (esto evitará el ruido y las demoras en el viaje desde el cliente hasta el servidor Shiny). ¿Algunas ideas?
El objetivo final de la aplicación es calcular un "tiempo de búsqueda": la duración que tarda un usuario en hacer clic en una coordenada específica después de que la imagen aparece en su navegador.
library(shiny) library(shinyjs) options(digits.secs = 3) # Modify and save default global time options click.time.image.js <- " document.getElementById('img').onclick = function(){ var the_time = new Date().getTime(); console.log(the_time); // set input$client_time to the_time: Shiny.setInputValue('client_time', the_time) } " shinyApp( ui = fluidPage( useShinyjs(), sidebarLayout( sidebarPanel( p("When clicking on the histogram, I'd like to capture the client-side computer's time"), actionButton(inputId="new_image", label= "New Image") ), mainPanel( imageOutput("img", click = "photo_click"), textOutput("client_time"), textOutput("server_time") ) ) ), server = function(input, output) { output$img <- renderImage({ input$new_image outfile <- tempfile(fileext='.png') png(outfile, width=400, height=400) hist(rnorm(100)) dev.off() shinyjs::runjs(click.time.image.js) list(src = outfile, alt = "This is alternate text") }, deleteFile = TRUE) output$server_time <- renderText({ req(input$photo_click) server.time <- as.character(strptime(Sys.time(), "%Y-%m-%d %H:%M:%OS")) # Time with milliseconds paste("SERVER TIME:", server.time) }) output$client_time <- renderText({ req(input$photo_click) req(input$client_time) client.time <- input$client_time # Time with milliseconds client.time <- as.POSIXct(client.time/1000, origin="1970-01-01") paste("CLIENTs TIME:", client.time) }) } )