如何在闪亮的仪表板中动态填充下拉框选项

时间:2016-10-20 11:14:34

标签: r drop-down-menu shinydashboard

我正在闪亮的仪表板中开发一个应用程序,因为我想在上传csv后动态填充下拉框。下拉列表将包含用户注册的前10个城市,我从以下代码获得。

final_data %>%
  group_by(registrant_city) %>%
  summarise(Total = n())    %>%
  arrange(desc(Total))      %>%
  top_n(n = 10)  

这些城市应该进入下拉框。

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 = ??
                          ))
                         ))

请帮助..

2 个答案:

答案 0 :(得分:5)

在您的服务器中使用updateSelectInput,如下所示,并在您的ui中设置choices = NULL:

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)

}

或者如果final_data是反应性的话:

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

}

一个工作示例:

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)

答案 1 :(得分:0)

我得到了上面的答案。这就是我做的。

ui.R

uiOutput("city_dropdown")

我的server.R看起来像是

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()为我提供了我想要填入下拉框的前10个城市,然后将其转换为列表可以获得所需的输出。