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

Shiny+Leaflet渲染交互式地图报错:找不到domain函数求助

修复Shiny+Leaflet交互式地图的错误

我看到你遇到的问题了,错误提示could not find function "domain"是因为你错误地把字符串拼接的结果当作函数来调用了,R没办法识别这种写法。咱们一步步来修复这个问题:

核心错误点分析

  • 你试图通过字符串拼接(比如paste0("zone_", anno.map(), "@data$", pat.map()))来引用数据字段,然后用domain()调用,这不符合R的变量引用规则,R无法将字符串转换为实际的变量/字段。
  • zone.WGS84是你在reactive表达式内创建的普通空间对象,不是reactive函数,不能用zone.WGS84()的方式调用。
  • 交互式标签(labels)的生成方式同样错误,不能通过字符串拼接后加()`来获取数据值。
  • 代码末尾的output$Mappa.ASL <不完整,缺少了renderLeaflet的定义。

修复后的完整代码

require(shiny)
require(stringr)
require(shinythemes)
require(leaflet)
require(RColorBrewer)
require(rgdal)
require(rgeos)
require(htmltools) # 确保加载这个包用于HTML标签

#### UI ####
ui <- fluidPage(
  theme = shinytheme("spacelab"),
  titlePanel("Indice"),
  navlistPanel(
    tabPanel(title = "Mappe",
             fluidRow(column(6, sliderInput(inputId = "Anno.map", label = "Anno di manifestazione", min = 2000, max = 2016, value = 2016, step = 1, ticks = FALSE, sep = "")),
                      column(6, selectInput(inputId = "Patologia.map", label = "Patologia", choices = list("SIST_NERV", "MESOT","TUM_RESP"), selected = "SIST_NERV", multiple = FALSE))),
             fluidRow(column(6, leafletOutput(outputId = "Mappa.ASL", height = "600px", width = "100%")))
    )
  )
)

#### SERVER ####
server <- function(input, output) {
  # NOT REACTIVE
  confini.comuni <- readOGR(dsn = "App/shapes/originali", layer = "rt.confini.comunali", stringsAsFactors = FALSE)
  confini.comuni.WGS84 <- spTransform(confini.comuni, CRS("+proj=longlat +datum=WGS84 +no_defs"))
  
  confini.asl <- readOGR(dsn = "App/shapes/originali", layer = "rt.confini.asl", stringsAsFactors = FALSE)
  confini.asl.WGS84 <- spTransform(confini.asl, CRS("+proj=longlat +datum=WGS84 +no_defs"))
  
  # REACTIVE
  anno.map <- reactive({input$Anno.map})
  pat.map <- reactive({input$Patologia.map})
  
  mappa <- reactive({
    # 读取对应年份的zone图层并转换坐标系
    zone.WGS84 <- spTransform(
      readOGR(dsn = "App/shapes/zone", layer = paste0("zone_", anno.map()), stringsAsFactors = FALSE),
      CRS("+proj=longlat +datum=WGS84 +no_defs")
    )
    
    # 直接从zone.WGS84的data中提取所需字段,无需字符串拼接
    pat_field <- zone.WGS84@data[[pat.map()]]
    exaslnome <- zone.WGS84@data[["EXASLNOME"]]
    pat_p_field <- zone.WGS84@data[[paste0(pat.map(), "p")]] # 获取带p后缀的字段
    
    # 创建颜色调色板,直接传入字段向量作为domain
    pal <- colorQuantile(
      palette = "YlOrRd", 
      domain = pat_field, 
      n = 6, 
      na.color = "#808080", 
      alpha = FALSE, 
      reverse = FALSE, 
      right = FALSE
    )
    
    # 生成交互式标签,直接使用提取的字段值
    labels <- sprintf(
      "<strong>%s</strong><br/>%g Segnalazioni<br/> %g con nesso positivo",
      exaslnome, pat_field, pat_p_field
    ) %>% lapply(HTML)
    
    # 构建Leaflet地图,注意zone.WGS84是普通对象,不用加()
    leaflet(options = leafletOptions(zoomControl = FALSE, dragging = FALSE, minZoom = 7.5, maxZoom = 7.5)) %>% 
      addPolygons(data = confini.comuni.WGS84, weight = 1, opacity = 1, color = "black") %>% 
      addPolygons(data = confini.asl.WGS84, weight = 2, opacity = 1, color = "red") %>% 
      addPolygons(
        data = zone.WGS84, 
        fillColor = ~pal(pat_field), 
        weight = 2, 
        opacity = 1, 
        color = "white", 
        dashArray = "3", 
        fillOpacity = 0.7, 
        highlight = highlightOptions(
          weight = 5, 
          color = "#666", 
          dashArray = "", 
          fillOpacity = 0.7, 
          bringToFront = TRUE
        ), 
        label = labels
      )
  })
  
  # 补全地图输出的渲染代码
  output$Mappa.ASL <- renderLeaflet({
    mappa()
  })
}

# 运行Shiny应用
shinyApp(ui = ui, server = server)

关键修改说明

  1. 字段引用方式:改用zone.WGS84@data[[pat.map()]]的方式动态获取选择的病理字段,这是R中动态引用列的正确方法,避免了错误的字符串拼接调用。
  2. **移除错误的()调用**:zone.WGS84是普通空间对象,不是reactive函数,所以直接使用即可,无需加()`。
  3. 标签生成:直接从zone.WGS84@data中提取EXASLNOME、病理字段和带p后缀的字段,用这些值来生成HTML标签。
  4. 补全输出代码:添加了完整的renderLeaflet调用,确保地图能正确渲染到output$Mappa.ASL。
  5. 路径修正:将读取shapefile的路径修正为你提供的完整路径(App/shapes/zone和App/shapes/originali),避免路径错误。

内容的提问来源于stack exchange,提问作者Gianpaolo Romeo

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.29 07:45:16