【问题标题】:SelectizeInput filtering in R ShinyR Shiny中的SelectizeInput过滤
【发布时间】:2020-08-15 00:14:15
【问题描述】:

我有两个问题: 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 个或多个输入,应用程序就会停止工作。

提前致谢!

【问题讨论】:

    标签: r shiny shinyapps shiny-reactivity


    【解决方案1】:

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

    请注意,使用observeEvent 比使用observe 语句更好(详见here)。

    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)
    

    【讨论】:

      【解决方案2】:

      您可以添加updateSelectInput,如下所示:

           observe({
      
               region <- input$RegionSelect
               req(region)
      
               updateSelectInput(session, "CountrySelect", 
                    choices = filter(DF, Region == !!region)$Country)
      
                          })
      

      另外,请修复您的(几乎)工作示例:您需要一个 library(dplyr),并删除 box(因为它仅来自 shinydashboard,您没有使用它)。

      【讨论】:

        猜你喜欢
        • 2018-11-08
        • 1970-01-01
        • 2018-04-03
        • 2015-11-01
        • 2020-02-02
        • 2020-08-03
        • 2021-06-10
        • 2018-09-01
        • 2021-08-04
        相关资源
        最近更新 更多