Я пытаюсь сделать работу Shiny App, где пользователь может манипулировать reactiveValues
с помощью кнопок или клавиш. Таким образом, минимальным примером может быть увеличение или уменьшение счетчика с помощью actionButton
Up/Down actionButton
или U/D. Пользователь должен иметь возможность использовать клавиши без щелчка в любом месте экрана.
Основываясь на примерах здесь на SO (используя ключ ввода с кнопкой действия в R Shiny, Shiny Respond to Enter и R Shiny key input binding), я придумал сценарий ниже. Однако он не реагирует вообще на клавиши U/D. Кнопки работают так, как ожидалось. Как только я нажимаю на кнопку, она получает вид "застрял", и я могу использовать клавиши "Enter" или "Пробел", чтобы повторять щелчки на кнопках, но клавиша U/D все еще не действует. Любая идея, что может быть неправильным?
И это код, который я написал:
library(shiny)
shinyApp(ui <- pageWithSidebar(
headerPanel("Test keyboard control"),
sidebarPanel(
tags$script(
'tags$head(
$(document).keydown(function(e)){
if (e.keyCode == 85) {
$("#upButton").click();
} else if (e.keyCode == 68) {
$("#downButton").click();
}
});'
),
actionButton("downButton", "Down"),
actionButton("upButton", "Up")
),
mainPanel(htmlOutput("text"))
),
server <- function(session, input, output) {
vals <- reactiveValues(count = 0)
observeEvent(input$downButton, {vals$count <- vals$count - 1})
observeEvent(input$upButton, {vals$count <- vals$count + 1})
output$text <- renderText(paste("Counter is:", vals$count))
}
)
Проблема в том, что входное событие только фиксирует код ключа нажатой клавиши, который остается неизменным после нажатия клавиши. Однако Shiny реагирует только на изменение данных события. Вам нужно каждый раз устанавливать данные событий в нечто новое; например, текущую метку времени. Посмотрите на этот рабочий пример:
library(shiny)
shinyApp(ui <- pageWithSidebar(
headerPanel("Test keyboard control"),
sidebarPanel(
tags$script('$(document).on("keydown",
function (e) {
if(e.which == 68) {
Shiny.onInputChange("downButton", new Date());
} else if (e.which == 85) {
Shiny.onInputChange("upButton", new Date());
}
});
'),
actionButton("downButton", "Down"),
actionButton("upButton", "Up")
),
mainPanel(htmlOutput("text"))
),
server <- function(session, input, output) {
vals <- reactiveValues(count = 0)
observeEvent(input$downButton, {vals$count <- vals$count - 1})
observeEvent(input$upButton, {vals$count <- vals$count + 1})
output$text <- renderText(paste("Counter is:", vals$count))
}
)
observeEvent
заobserveEvent
клавиши, но это также не имело эффекта. Я очень новичок в Shiny / Javascript.