R Shiny key и actionButton привязка к реактивным значениям [дубликаты]

1

Я пытаюсь сделать работу 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

1 ответ

3
Лучший ответ

Проблема в том, что входное событие только фиксирует код ключа нажатой клавиши, который остается неизменным после нажатия клавиши. Однако 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))
}
)
  • 0
    Да, ваш пример работает, но, боюсь, я не понимаю, как адаптировать его к моему делу. Я пытался привязать ввод ключа к actionButtons, но это не сработало: `if (e.keyCode == 85) {Shiny.onInputChange (" upButton ", new Date ()); } else if (e.keyCode == 68) {Shiny.onInputChange ("downButton", new Date ()); } `Я также пытался с отдельными событиями и observeEvent за observeEvent клавиши, но это также не имело эффекта. Я очень новичок в Shiny / Javascript.
  • 0
    Хм, я не знаю, что ты сделал. Я только что обменял часть скрипта в вашем коде, и это сработало. Во всяком случае, я обновил свой ответ, чтобы соответствовать вашему примеру. Если он по-прежнему не работает, я могу только представить, что ваш браузер фиксирует нажатие клавиши перед отправкой на веб-сайт. Например, Firefox может быть настроен на немедленный поиск по веб-сайту, когда пользователь вводит текст. В этом случае вы не увидите нажатие клавиши в Shiny.
Показать ещё 1 комментарий

Ещё вопросы

Сообщество Overcoder
Наверх
Меню