En una aplicación Shiny, ¿es posible tener un enlace que escuche qué tecla presiona un usuario?
No estoy muy familiarizado con JavaScript, pero estoy buscando algo como:
window.onkeydown = function (e) { var code = e.keyCode ? e.keyCode : e.which; alert(code); };
donde la entrada clave se utilizará en el server.R
, por ejemplo:
shinyServer(function(input, output) { output$text <- renderText({ paste('You have pressed the following key:', input$key) }) # ... })
Puede agregar un oyente para presionar teclas. Shiny.onInputChange
se puede utilizar para vincular la tecla presionada a una variable shiny:
library(shiny) runApp( list(ui = bootstrapPage( verbatimTextOutput("results"), tags$script(' $(document).on("keypress", function (e) { Shiny.onInputChange("mydata", e.which); }); ') ) , server = function(input, output, session) { output$results = renderPrint({ input$mydata }) } ))
para eventos de keydown
que puede sustituir:
tags$script(' $(document).on("keydown", function (e) { Shiny.onInputChange("mydata", e.which); }); ')
Si desea que esto funcione en varias prensas, puede crear un contador de prensa adicional que se actualice al presionar una tecla, vincular ese valor a una variable diferente y observar el contador en lugar del código clave. Aquí hay un código de UI de ejemplo:
tags$script(' pressedKeyCount = 0; $(document).on("keydown", function (e) { Shiny.onInputChange("pressedKey", pressedKeyCount++); Shiny.onInputChange("pressedKeyId", e.which); });' )
Y el código del servidor asociado:
observeEvent(input$pressedKey, { if(input$pressedKeyId >= 49 && input$pressedKeyId <= 57){ # numbers values$numClick <- (input$pressedKeyId - 48); flipNumber(); } if(input$pressedKeyId >= 37 && input$pressedKeyId <= 40){ # arrow keys arrowCode <- input$pressedKeyId - 37; xInc <- ((arrowCode+1) %% 2) * (arrowCode - 1); yInc <- ((arrowCode) %% 2) * (arrowCode - 2) * -1; if(!any(values$click == c(-1,-1))){ values$click <- (((values$click - 1) + c(xInc, yInc) + 9) %% 9) + 1; } } });