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)
关键修改说明
- 字段引用方式:改用
zone.WGS84@data[[pat.map()]]的方式动态获取选择的病理字段,这是R中动态引用列的正确方法,避免了错误的字符串拼接调用。 - **移除错误的()
调用**:zone.WGS84是普通空间对象,不是reactive函数,所以直接使用即可,无需加()`。 - 标签生成:直接从
zone.WGS84@data中提取EXASLNOME、病理字段和带p后缀的字段,用这些值来生成HTML标签。 - 补全输出代码:添加了完整的
renderLeaflet调用,确保地图能正确渲染到output$Mappa.ASL。 - 路径修正:将读取shapefile的路径修正为你提供的完整路径(
App/shapes/zone和App/shapes/originali),避免路径错误。
内容的提问来源于stack exchange,提问作者Gianpaolo Romeo
相关产品推荐
相关产品推荐

