Включение, а затем отключение реактивных событий на основе ввода пользователя - PullRequest
0 голосов
/ 01 июня 2019

Я пытаюсь создать приложение, которое позволяет пользователю выполнять поиск по пользовательскому термину. Логика, которую я пытаюсь создать, заключается в том, что пользователь вводит строку и нажимает клавишу ВВОД на клавиатуре, после чего выполняется поиск.Это было достижимо.Однако в приведенном ниже примере после нажатия кнопки ввода выполняются все изменения в текстовом вводе

. Я попытался сбросить последний ключ на пустой и т. Д., Но не смог решить эту небольшую проблему, упростил кодниже

library(shiny)


ui <- fluidPage(

   # Application title
   titlePanel("example"),

   fluidRow( 
     column( 3, offset = 1,
             tags$script(' $(document).on("keydown", function (e) {
                                                  Shiny.onInputChange("lastkeypresscode", e.keyCode);
                                                  });
                                                  '),
     textInput("searchtext", 
               label = "Text input",
               value = "")),
     column( 4, textOutput("mysearch")),
     column( 4) 
    )



server <- function(input, output) {
  observe({
    if(!is.null(input$lastkeypresscode)){
      if(input$lastkeypresscode == 13){
         output$mysearch <- renderText(input$searchtext)

      }
    }
  })
}

# Run the application 
shinyApp(ui = ui, server = server)

Ожидаемый результат - изменения должны быть видны только в тексте, выведенном после нажатия клавиши ВВОД

1 Ответ

0 голосов
/ 01 июня 2019

Вы можете прикрепить обработчик события onKeyPress к вводу текста:

library(shiny)

textInput2 <- function(inputId, label, value = "", width = NULL, placeholder = NULL){
  input <- textInput(inputId, label, value, width, placeholder)
  input$children[[2]] <- 
    htmltools::tagAppendAttributes(
      input$children[[2]], 
      onKeyPress = sprintf("Shiny.setInputValue('%s_keypress', event.key)", inputId))
  input
}

ui <- fluidPage(
  textInput2("textinput", "Enter text:"),
  textOutput("textoutput")
)

server <- function(input, output){
  observeEvent(input[["textinput_keypress"]], {
    if(input[["textinput_keypress"]] == "Enter"){
      output[["textoutput"]] <- renderText({
        input[["textinput"]]
      })
    }
  })
}

shinyApp(ui, server)

Некоторые люди говорят, что не рекомендуется определять output внутри наблюдателя.Чтобы избежать этого, вы можете сделать:

server <- function(input, output){

  Text <- eventReactive(input[["textinput_keypress"]], {
    req(input[["textinput_keypress"]] == "Enter")
    input[["textinput"]]
  })

  output[["textoutput"]] <- renderText({
    Text()
  })

}

В качестве альтернативы см. этот ответ .Но настоящий ответ, я думаю, лучше.


РЕДАКТИРОВАТЬ

ОП утверждает, что не работает.Возможно, более надежное решение:

onKeyPress = sprintf("Shiny.setInputValue('%s_keypress', event.which)", inputId)

и замените

input[["textinput_keypress"]] == "Enter"

на

input[["textinput_keypress"]] == 13
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...