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
相关产品推荐
相关产品推荐

