You need to enable JavaScript to run this app. 基于R Shiny开发spData包NLD_muni交互式地图的代码优化问题
优惠活动
大模型
产品
解决方案
定价
更多

基于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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.08 12:24:00