How to dynamically populate dropdown box choices in shiny dashboard

drop-down-menu, r, shinydashboard

Solution

Use `updateSelectInput` in your server like below and set choices = NULL in your ui :

function(input, output, session) {

  # If this isn't reactive you can put it in your global
  choices_cities <- final_data %>%
    group_by(registrant_city) %>%
    summarise(Total = n())    %>%
    arrange(desc(Total))      %>%
    top_n(n = 10)  

  updateSelectInput(session = session, inputId = "cities", choices = choices_cities$registrant_city)

}

Or if `final_data` is reactive something like this :

function(input, output, session) {

  choices_cities <- reactive({
    final_data %>%
      group_by(registrant_city) %>%
      summarise(Total = n())    %>%
      arrange(desc(Total))      %>%
      top_n(n = 10)  
  })

  observeEvent(choices_cities(), {
    updateSelectInput(session = session, inputId = "cities", choices = choices_cities()$registrant_city)
  })

}

A working example :

library("dplyr")
library("shiny")

data("world.cities", package = "maps")

ui <- fluidPage(
  sliderInput(inputId = "n", label = "n", min = 10, max = 30, value = 10),
  selectInput(inputId = "cities", label = "Select City", choices = NULL)
)

server <- function(input, output, session) {

  choices_cities <- reactive({
    choices_cities <- world.cities %>%
      arrange(desc(pop)) %>%
      top_n(n = input$n, wt = pop) 
  })

  observe({
    updateSelectInput(session = session, inputId = "cities", choices = choices_cities()$name)
  })
}

shinyApp(ui = ui, server = server)

Problem

I am developing one app in shiny dashboard in that I want to dynamically populate dropdown box once csv is uploaded. Dropdown will contain top 10 cities by user registrations which I get from following code. ``` final_data %>% group_by(registrant_city) %>% summarise(Total = n()) %>% arrange(desc(Total)) %>% top_n(n = 10) ``` These cities should go into dropdown box. ``` tabItem("email", fluidRow( box( width = 4, status = "info",solidHeader = TRUE, title = "Send Emails", selectInput("email_select", "Select Email Content", choices = c("Price" = "price", "Services" = "service" )), selectInput("cities", "Select City", choices = ?? )) )) ``` Please help..

Original source