You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

R Shiny应用中checkboxGroupInput多值过滤问题排查

解决Shiny地图应用中多值字段的筛选问题

问题背景

开发存储历史艺术节资料档案的数据库,并基于此构建交互式地图Shiny应用,需要支持用户按艺术节届次筛选。但数据集中festival_edition字段部分条目包含多个选项(如ca72;ca76),当前地图仅能渲染该字段为单一值(如ca72)的条目,多值条目无法显示。

问题根源

原代码中的筛选逻辑存在两处错误:

observeEvent(input$festival_edition, {
    selected_editions <- str_split(input$festival_edition, ";")
    carchives_festival <- carchives[carchives$festival_edition %in% selected_editions, ]
  • input$festival_edition是用户通过多选框选中的单一值向量(如c("ca72", "ca76")),不需要用str_split拆分
  • 直接用%in%匹配整个字符串,无法识别包含多个值的条目(比如ca72;ca76不会被判定为包含ca72或ca76)

解决方案

我们需要调整筛选逻辑,判断每个条目是否包含至少一个用户选中的届次。推荐使用以下直观的处理方式:

核心修改思路

先将包含多个届次的条目拆分为单行单值的结构,筛选出符合条件的行后,再去重恢复原条目,确保多值条目只要包含任意一个选中届次就能被显示。

完整修改后的代码

library(shiny)
library(dplyr)
library(leaflet)
library(tidyr)
library(readr)
library(stringr)

# Read CSV file
carchives <- read_csv("carifesta-archives.csv")

# Separate coordinates column into Latitude and Longitude columns
carchives <- separate(carchives, col = coordinates, into = c("Latitude", "Longitude"), sep = ",")

# Convert coordinates columns to numeric values
carchives$Longitude <- as.numeric(carchives$Longitude)
carchives$Latitude <- as.numeric(carchives$Latitude)

festival_list <- c("carifesta_1972" = "ca72",
                   "carifesta_1976" = "ca76",
                   "carifesta_1979" = "ca79",
                   "carifesta_1981" = "ca81",
                   "carifesta_1988" = "ca88",
                   "carifesta_1992" = "ca92",
                   "carifesta_1995" = "ca95",
                   "carifesta_2000" = "ca00",
                   "unknown" = "NULL")

# Define UI for application
ui <- fluidPage(
  
  # Application title
  titlePanel("Map of Carifesta archives"),
  
  # Add filter for festival edition
  checkboxGroupInput("festival_edition", "Filter by festival edition",
                     choices = festival_list,
                     selected = festival_list,
                     inline = TRUE
  ),
  
  # Display map on screen
  leafletOutput('locations')
)

# Define server logic
server <- function(input, output, session) {
  
  observeEvent(input$festival_edition, {
    # 处理选中的届次,排除NULL选项(保留unknown筛选逻辑)
    selected_editions <- input$festival_edition[input$festival_edition != "NULL"]
    
    # 拆分多值字段,筛选后去重保留原条目
    carchives_festival <- carchives %>%
      separate_rows(festival_edition, sep = ";") %>%
      filter(
        # 匹配选中的届次,或者选中了unknown且条目为NULL
        festival_edition %in% selected_editions | 
        ("NULL" %in% input$festival_edition & festival_edition == "NULL")
      ) %>%
      distinct()
    
    # Render map
    output$locations <- renderLeaflet({
      leaflet(data = carchives_festival) %>%
        addTiles() %>%
        addMarkers(
          lng = ~Longitude, lat = ~Latitude,
          popup = paste(
            "Repository:", repository, "<br>",
            "Label:", "<a href=", repo_url, ">", label, "</a>", "<br>",
            "Description:", description, "<br>",
            "Files:", folders
          ),
          clusterOptions = markerClusterOptions(
            maxClusterSize = 100,
            color = "red",
            opacity = 0.5
          )
        )
    })
  })
}

# Run application
shinyApp(ui = ui, server = server)

内容的提问来源于stack exchange,提问作者R Kooiker

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.19 06:22:14