我正在制作类似于this one that's done in tableau的Shiny / Leaflet应用。它显示了不同年份的世界级贫困观,允许用户按变量,地区和年份过滤地图。
问题是全局国家级shapefile(来自NaturalEarthData)渲染速度非常慢。我正在研究简化这些多边形以减少加载时间的不同方法,但与此同时,我正在研究其他可能的解决方案。
理想情况下,我会使用Shiny控件切换不同的地图图层,并使用leafletProxy
更新地图。但是因为每个图层更改再次绘制整个地图,所以这也很慢。
当我在 Leaflet中包含不同的图层时,图层渲染得更快,更快。 (我假设这是因为Leaflet中的addLayersControl
选项仅更改多边形的fillColor
而不是重绘整个全局shapefile,就像使用leafletProxy
一样。但有没有办法在Leaflet之外访问这些层?
为了说明,这里有一些虚拟代码:
#load required libraries
library(shiny)
library(leaflet)
library(raster)
#begin shiny app
shinyApp(
ui <- fluidPage(
leafletOutput("map", width = "100%", height = 600)
), #END UI
server <- function(input, output, session){
#load shapefile
rwa <- getData("GADM", country = "RWA", level = 0)
#render map
output$map <- renderLeaflet({
leaflet() %>%
addTiles() %>%
addPolygons(data = rwa,
fillColor = "blue",
group = "blue") %>%
addPolygons(data = rwa,
fillColor = "red",
group = "red") %>%
addLayersControl(baseGroups = c("blue", "red"),
options = layersControlOptions(collapsed = F))
}) #END RENDER LEAFLET
} #END SERVER
) #END SHINY APP
您可以轻松地在传单地图对象中的蓝色和红色图层之间切换。但是,当我将地图图层从蓝色切换为红色时,我想要一个Shiny表来更新红色多边形图层中的属性。我希望能够将这个对象拉到传单之外并在一个闪亮的observeEvent
中使用它。这可能/我该怎么做?
答案 0 :(得分:0)
您可以为Shiny服务器中的{MAP_ID}_groups
输入定义观察者。
示例:
server <- function(input, output, session) {
# ...
output$my_map <- renderLeaflet({
# ...
})
observe({
selected_groups <- req(input$my_map_groups)
# do whatever ...
})
}
当用户在图层控件中选择一个组时,此输入将更新。