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

Shiny绘制地图点位时报'closure类型对象不可子集化'错误

错误原因

你对响应式对象的调用方式有误:reactive()定义的变量本质是一个响应式函数,要获取它内部存储的数据集,必须加()调用后才能取值,直接对points用$取子集就会触发「closure类型对象不可取子集」的报错。

具体修改点

你只需要调整server部分的两处调用即可:

  • 渲染leaflet地图时,将points$long改为points()$long、points$lat改为points()$lat
  • 打印标记数据时,将print(points)改为print(points())
修正后完整代码
# 提前加载依赖包、载入test数据集
library(shiny)
library(leaflet)

ui <- fluidPage(
  actionButton("recalc", "New points"),
  mainPanel(
    tabsetPanel(
      tabPanel("Order Locations", leafletOutput("map",width="80%",height="400px")),
      tabPanel("Markers", verbatimTextOutput("markers"))
    )
  )
)

server <- function(input, output, session) {
  
  points <- reactive({test})
  
  output$map <- renderLeaflet({
    leaflet() %>%
      addTiles() %>%
      addMarkers(lng=points()$long,lat=points()$lat)
  })
  output$markers <- renderPrint({print(points())})
}

shinyApp(ui, server)
补充说明

你当前的points响应式逻辑没有绑定任何输入变量,只是固定返回静态的test数据集,这种场景下其实可以不用包reactive(),直接在需要用到test的地方调用test即可。如果你后续需要实现点击「New points」按钮动态更新点位的功能,只需要在reactive()中调用对应的输入变量(比如input$recalc),就能触发点位的自动重渲染。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.26 04:54:04