如何在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
相关产品推荐
相关产品推荐

