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

如何在R Markdown Shiny Leaflet看板中实现全选功能?

实现Shiny选择框的"全选"逻辑

你的问题核心是当前筛选逻辑未处理"All"选项的特殊情况——原数据的SID74和SID79是数值型,而选择框里的"All"是字符,直接用%in%会导致无匹配结果。只需修改mapFiltered响应式函数的逻辑,判断是否选中"All"再决定筛选范围即可:

修改后的核心代码

mapFiltered <- reactive({
  # 处理SID74筛选:若选了"All"则取所有唯一值,否则转数值后筛选
  sid74_target <- if ("All" %in% input$SID74_select) {
    unique(subset$SID74)
  } else {
    as.numeric(input$SID74_select)
  }
  
  # 处理SID79筛选:逻辑同SID74
  sid79_target <- if ("All" %in% input$SID79_select) {
    unique(subset$SID79)
  } else {
    as.numeric(input$SID79_select)
  }
  
  filtered_all <- subset %>%
    filter(SID74 %in% sid74_target) %>%
    filter(SID79 %in% sid79_target)
  
  return(filtered_all)
})

完整可运行代码

---
title: "try"
date: "`r Sys.Date()`"
output:
  flexdashboard::flex_dashboard:
  vertical_layout: fill
runtime: shiny
---
  
```{r setup, include = FALSE}
knitr::opts_chunk$set(echo=FALSE)
library(flexdashboard)
library(shiny)
library(tidyverse)
library(sf)
library(leaflet)

pdf(NULL)

nc <- st_read(system.file("shape/nc.shp", package="sf"))

subset <- nc %>% filter(SID74 <=5)

Map

Filters {.sidebar}

selectInput(inputId = "SID74_select",
                              label = "SID74",
                              choices = c("All", sort(unique(subset$SID74))),
                              multiple = TRUE,
                              selectize = TRUE,
                              selected = "All")
                              
selectInput(inputId ="SID79_select",
            label ="SID79",
            choices = c("All",sort(unique(subset$SID79))),
            multiple = TRUE,
            selectize = TRUE,
            selected = "All")
mapFiltered <- reactive({
  sid74_target <- if ("All" %in% input$SID74_select) {
    unique(subset$SID74)
  } else {
    as.numeric(input$SID74_select)
  }
  
  sid79_target <- if ("All" %in% input$SID79_select) {
    unique(subset$SID79)
  } else {
    as.numeric(input$SID79_select)
  }
  
  filtered_all <- subset %>%
    filter(SID74 %in% sid74_target) %>%
    filter(SID79 %in% sid79_target)
  
  return(filtered_all)
})

Row

Map

renderLeaflet({

  if (nrow(mapFiltered()) == 0) {
    return(NULL)
  }
  
  dat_map <- mapFiltered()

  leaflet() %>% 
    setView(lng = -79.5, lat = 36,zoom =7) %>%
    addTiles(group = "OSM (default)") %>% 
    addPolygons(data = dat_map)
})

## 逻辑说明
- 当选择框包含"All"时,直接取该字段的所有唯一数值作为筛选目标,等同于全选;
- 当未选"All"时,将选择框返回的字符型值转为数值(匹配原数据类型),再进行筛选;
- 即使同时选中"All"和其他值,依然会按全选处理,避免逻辑冲突。

内容的提问来源于stack exchange,提问作者jaykay
相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.10 17:40:05