Shiny应用pickerInput联动及按年份筛选多边形绘制问题求助
问题核心原因
- 你当前的筛选逻辑只匹配了多边形名称,没有同步匹配选中的年份,所以无法过滤出对应年份的多边形数据
- shp属性表的多边形名称字段名和codebook不一致,需要先对齐字段名
- 没必要把
renderLeaflet/renderTable包裹在observeEvent中,render函数本身就具备响应式触发能力 - 原代码缺失leaflet包的加载,会导致绘图报错
调整步骤
1. 先对齐测试数据的字段与命名
首先将你提供的测试数据正确赋值并对齐字段:
# 加载缺失的leaflet包 library(leaflet) # 空间多边形数据赋值为shp,对齐多边形字段名 shp <- new("SpatialPolygonsDataFrame", # 此处替换为你提供的空间数据完整代码 ) # 把shp里的poly字段名改成和codebook一致的Polygon names(shp@data)[names(shp@data) == "poly"] <- "Polygon" # 对照表数据赋值为codebook codebook <- structure(list(X = c(NA, NA, NA, ...)), # 此处替换为你提供的codebook完整代码 )
2. 替换Server端的核心响应逻辑
主要修改data反应式的筛选逻辑,删除冗余的observeEvent包裹:
server <- function(input, output, session) { # 原有的pickerInput联动逻辑保留即可 observeEvent(input$input_period, { codebook_mod <- codebook[codebook$Year == input$input_period, ] disabled_choices <- !unique(codebook$Polygon) %in% codebook_mod$Polygon updatePickerInput(session = session, inputId = "picker_cny", choices = unique(codebook$Polygon), choicesOpt = list( disabled = disabled_choices, style = ifelse(disabled_choices, yes = "color: rgba(119, 119, 119, 0.5);", no = "") )) }, ignoreInit = TRUE) # 核心修改:同时按年份+选中多边形筛选空间数据 data <- reactive({ # 未选多边形时返回空,避免报错 req(input$picker_cny) shp[shp@data$year == input$input_period & shp@data$Polygon %in% input$picker_cny, ] }) # 直接写render函数即可,自动响应输入变化 output$m <- renderLeaflet({ leaflet() %>% addTiles(group = "OSM (默认底图)") %>% addPolygons(data = data()) }) output$table <- renderTable(data()@data) }
效果验证
- 选中
year_1+勾选polygon_a、polygon_b:只会渲染year_1对应的两个多边形 - 选中
year_3时所有多边形选项禁用,不会渲染任何图形 - 不同年份选中同一个多边形,会渲染对应年份的不同形状
内容的提问来源于stack exchange,提问作者AnEostig
相关产品推荐
相关产品推荐

