首页 > 解决方案 > R Shiny中的SelectizeInput过滤

问题描述

我有 2 个问题:1)我想知道是否可以根据之前的输入进行一列选择。请查看代码,我将解释我的意思:

library(shiny)

Country <- c("USA", "Mexico", "Canada", "China", "Vietnam", "India", "France", "Germany", "Poland")
Region <- c("Americas", "Americas", "Americas", "Asia", "Asia", "Asia", "Europe", "Europe", "Europe")
Product <- c(11, 22, 33, 44, 55, 66, 77, 88, 99)
Date <- c(1, 2, 3, 4, 5, 6, 7, 8, 9)
DF <- cbind(Region, Country, Product, Date)
DF <- as.data.frame(DF)

Region <- as.factor(sort(unique(DF$Region)))
Country <- as.factor(sort(unique(DF$Country)))

ui <- fluidPage(titlePanel("Filtering experiments"),
sidebarLayout(
    # Sidebar panel for inputs ----
    sidebarPanel(width = 3,

           selectizeInput("RegionSelect", "Region", Region, selected = NULL, multiple = TRUE),
           selectizeInput("CountrySelect", "Country", Country, selected = NULL, multiple = TRUE)),

    # Main panel for displaying outputs ----
    mainPanel( fluidPage(  box(width = 12, tableOutput("table")) )     )    )   )server <- function(input, output) {

output$table <- renderTable({
    filtered <- DF
    if (!is.null(input$RegionSelect)) {filtered <- filtered %>% filter(Region == input$RegionSelect)}
    if (!is.null(input$CountrySelect)) {filtered <- filtered %>% filter(Country == input$CountrySelect)}

    Total <- data.frame(filtered$Product)
    ShowTable <- data.frame(cbind(Total))
    ShowTable
})}shinyApp(ui, server)

每当该地区被选为“美洲”时,用户仍然可以看到所有国家/地区,而不仅仅是美国、加拿大和墨西哥。

我试图通过过滤来修复它:

       selectizeInput("CountrySelect", "Country", as.factor(sort(unique(filtered$Country %>% filter(Region == input$RegionSelect)}))), selected = NULL, multiple = TRUE))

但它没有工作,所以我希望你有一些想法。

2) 即使“multiple = TRUE”,只要在同一输入行中选择了 2 个或多个输入,应用程序就会停止工作。

提前致谢!

标签: rshinyshinyappsshiny-reactivity

解决方案


您可以使用根据另一个输入的值updateSelectizeInput来更新内容。selectizeInput

请注意,使用它observeEvent比使用observe语句更好(有关详细信息,请参见此处)。

library(shiny)
library(dplyr)

Country <- c("USA", "Mexico", "Canada", "China", "Vietnam", "India", "France", "Germany", "Poland")
Region <- c("Americas", "Americas", "Americas", "Asia", "Asia", "Asia", "Europe", "Europe", "Europe")
Product <- c(11, 22, 33, 44, 55, 66, 77, 88, 99)
Date <- c(1, 2, 3, 4, 5, 6, 7, 8, 9)
DF <- cbind(Region, Country, Product, Date)
DF <- as.data.frame(DF)

Region <- as.factor(sort(unique(DF$Region)))
Country <- as.factor(sort(unique(DF$Country)))

ui <- fluidPage(titlePanel("Filtering experiments"),
                sidebarLayout(
                  # Sidebar panel for inputs ----
                  sidebarPanel(
                    width = 3,

                    selectizeInput(
                      "RegionSelect",
                      "Region",
                      Region,
                      selected = NULL,
                      multiple = TRUE
                    ),
                    selectizeInput(
                      "CountrySelect",
                      "Country",
                      Country,
                      selected = NULL,
                      multiple = TRUE
                    )
                  ),

                  # Main panel for displaying outputs ----
                  mainPanel(fluidPage(
                    width = 12, tableOutput("table")
                  ))
                ))

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

  observeEvent(input$RegionSelect, {
    req(input$RegionSelect)
    test <- DF %>%
      filter(Region %in% input$RegionSelect) %>%
      select(Country)

    updateSelectizeInput(session, 
                         inputId = "CountrySelect",
                         choices = test)
  })

  output$table <- renderTable({
    # Uncomment the two lines with comments if you want to make it mandatory to chose a continent to show the table

    # req(input$RegionSelect)
    req(input$CountrySelect)
    DF %>%
      # filter(Region %in% input$RegionSelect) %>%
      filter(Country %in% input$CountrySelect)
  })}
shinyApp(ui, server)

推荐阅读