R Encuadernación de entrada de clave shiny

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; } } });