Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How to dynamically populate dropdown box choices in shiny dashboard

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..

like image 481
Neil Avatar asked Oct 20 '16 11:10

Neil


2 Answers

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)
like image 186
Victorp Avatar answered Oct 22 '22 03:10

Victorp


I got the answer for above. Here is what I did.

ui.R

uiOutput("city_dropdown")

And my server.R looks like following

output$city_dropdown <- renderUI({

    city <- reg_city(final_data)
    city <- city$registrant_city
    city <- as.list(city)
    selectInput("email_select", 
            "Select Email Content",
            choices = city
            )
})

reg_city() gives me the top 10 cities which I want to populate into drop down box,then converting it to a list gives me desired output.

like image 25
Neil Avatar answered Oct 22 '22 01:10

Neil