基于R Shiny开发spData包NLD_muni交互式地图的代码优化问题
核心错误梳理
- 重复定义
output$map,后一次的来源变量渲染逻辑直接覆盖人口变量渲染逻辑,初始加载就仅显示来源类数据 - 代码中出现未定义变量
world_vars,属于笔误 - 两个
observe监听逻辑嵌套错误,人口下拉选择的更新事件无法正常触发 - 每次
tmapProxy更新仅绘制单一变量图层,新图层会覆盖旧图层,点击弹窗仅保留最后绘制图层的元数据 - 未主动配置弹窗显示字段,导致无法同时展示人口、来源两类变量信息
- 缺少需求中提到的滑块交互组件
修正后完整代码
library(shiny) library(tmap) library(spData) library(sf) # 加载数据 data(NLD_muni) # 变量分组(原有逻辑保留) pop_vars <- setdiff(names(NLD_muni), c("code", "name", "province", "geometry", "origin_native", "origin_west", "origin_non_west", "population", "pop_men", "pop_women")) origin_vars <- setdiff(names(NLD_muni), c ("code", "name", "province", "geometry", "population", "pop_0_14", "pop_15_24", "pop_25_44", "pop_45_64", "pop_65plus", "pop_men", "pop_women")) # 开启tmap交互模式 tmap_mode("view") ui <- fluidPage( tmapOutput("map", width = "100%", height = "80vh"), # 新增滑块控制图层透明度 sliderInput("alpha", "填充透明度", min = 0.1, max = 1, value = 0.7, step = 0.1), selectInput("pop", "人口类变量", pop_vars), selectInput("or", "来源类变量", origin_vars) ) server <- function(input, output, session) { # 仅保留一个renderTmap,初始加载两个图层 output$map <- renderTmap({ tm_shape(NLD_muni) + tm_polygons(col = pop_vars[1], alpha = input$alpha, group = "人口变量", id = "name", popup.vars = c("行政区名称" = "name", "所属省份" = "province", pop_vars[1] = pop_vars[1], origin_vars[1] = origin_vars[1])) + tm_polygons(col = origin_vars[1], alpha = input$alpha, group = "来源变量", id = "name", popup.vars = c("行政区名称" = "name", "所属省份" = "province", pop_vars[1] = pop_vars[1], origin_vars[1] = origin_vars[1])) + # 增加图层切换控件 tm_layers_control(position = "topright") }) # 独立监听人口变量切换 observeEvent(input$pop, { tmapProxy("map", session, { tm_remove_layer(1) tm_remove_layer(2) tm_shape(NLD_muni) + tm_polygons(col = input$pop, alpha = input$alpha, group = "人口变量", id = "name", popup.vars = c("行政区名称" = "name", "所属省份" = "province", input$pop = input$pop, input$or = input$or)) + tm_polygons(col = input$or, alpha = input$alpha, group = "来源变量", id = "name", popup.vars = c("行政区名称" = "name", "所属省份" = "province", input$pop = input$pop, input$or = input$or)) }) }) # 独立监听来源变量切换 observeEvent(input$or, { tmapProxy("map", session, { tm_remove_layer(1) tm_remove_layer(2) tm_shape(NLD_muni) + tm_polygons(col = input$pop, alpha = input$alpha, group = "人口变量", id = "name", popup.vars = c("行政区名称" = "name", "所属省份" = "province", input$pop = input$pop, input$or = input$or)) + tm_polygons(col = input$or, alpha = input$alpha, group = "来源变量", id = "name", popup.vars = c("行政区名称" = "name", "所属省份" = "province", input$pop = input$pop, input$or = input$or)) }) }) # 监听透明度滑块变化 observeEvent(input$alpha, { tmapProxy("map", session, { tm_remove_layer(1) tm_remove_layer(2) tm_shape(NLD_muni) + tm_polygons(col = input$pop, alpha = input$alpha, group = "人口变量", id = "name", popup.vars = c("行政区名称" = "name", "所属省份" = "province", input$pop = input$pop, input$or = input$or)) + tm_polygons(col = input$or, alpha = input$alpha, group = "来源变量", id = "name", popup.vars = c("行政区名称" = "name", "所属省份" = "province", input$pop = input$pop, input$or = input$or)) }) }) } shinyApp(ui, server)
效果说明
- 地图右上角自带图层切换按钮,可单独查看人口变量、来源变量的分布
- 点击任意行政区,弹窗会同时展示行政区基础信息、当前选中的人口变量值、当前选中的来源变量值
- 拖动透明度滑块可调整填充色的透明程度,叠加查看两类变量的分布关联
- 下拉切换变量时地图和弹窗字段会同步更新
内容的提问来源于stack exchange,提问作者Sean
相关产品推荐
相关产品推荐

