如何根据 Shiny 中的文本输入更新 SelectizeInput

How to update a SelectizeInput depending on a textInput in Shiny

我创建了一个包含 textInputselectizeInput 的应用程序。根据用户的输入,如果输入可以在一个数据集中找到,您将根据 selectizeInput.

中的 textInput 看到所有可能性。

这样,如果用户输入了一个不在数据集中的词,selectizeInput就无法显示任何选择。

一切正常,但我发现了一个问题。如果用户开始写一个正确的单词,用户会得到一个下拉列表……然后,如果输入被删除……下拉列表仍然存在(来自 selectizeInput 的选择仍然存在)。

这里是代码:

library(shiny)
library(dplyr)
library(stringr)

ui <- fluidPage(
  textInput("my_input", "Introduce a word"),
  selectizeInput(inputId = "dropdown_list", label = "Choose the variable:", choices=character(0)),
  
)

server <- function(input, output, session) {
  
  my_list <- reactive({
    req(input$my_input)
    data <- as.data.frame(storms)
    
    res <- subset(data, (grepl(pattern = str_to_sentence(input$my_input), data$name))) %>% 
      dplyr::select(name)
    
    res <- as.factor(res$name)
    
    
    return(res)
  })
  
  # This is to generate the choices (gene list) depending on the user's input.
  observeEvent(input$my_input, {
    updateSelectizeInput(
      session = session,
      inputId = "dropdown_list",
      choices = my_list(), options=list(maxOptions = length(my_list())),
      server = TRUE
    )
  })

}

shinyApp(ui, server)

你知道如果用户删除了输入,我如何从 selectizeInput 中删除选项?

非常感谢

此致

问题是req(input$myinput)。因此,如果用户删除输入 my_list() 则不会更新。您可以使用 if 来检查输入是否等于空字符串,而不是 req

my_list <- reactive({
    if (!input$my_input == "") {
      data <- as.data.frame(storms)
      
      res <- subset(data, grepl(pattern = str_to_sentence(input$my_input), data$name), name)
      
      res <- as.factor(res$name)
      
      return(res)
    } 
  })