How to update a SelectizeInput depending on a textInput in Shiny

353 views Asked by At

I have create one app that contains a textInput and a selectizeInput. Depending on the user's input and if the input can be found in one dataset, you will see all the possibilities according to that textInput in the selectizeInput.

image 1

In this way, if the user introduces a word that it is not in the dataset, the selectizeInput can't display any choice.

image 2

Everything works fine, but I found one problem. If the user starts writing a correct word, the user gets a dropdown list... and then, if the input is removed... the dropdown list is still there (the choices from selectizeInput are still there).

image 3

Here the code:

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)

Do you know how can I remove the choices from the selectizeInput if the user deletes the input?

Thanks very much in advance

Regards

1

There are 1 answers

2
stefan On BEST ANSWER

The issue is the req(input$myinput). Hence, if the user deletes the input my_list() does not get updated. Instead of req you could use an if to check whether the input is equal to an empty string:

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