我有一个使用R Shiny渲染地图的leaflet应用程序。当用户平移/缩放地图时,应用会获取地图边界并使用observe函数加载相关数据。
这里是代码的简化版,由于与该问题无关,因此我删除了用于选择数据的代码。
# Start of Shiny Server Code
shinyServer(function(input, output) {
#Render Map
output$mymap <- renderLeaflet({
leaflet() %>%
# set centre and extent of map
setView(lng = -0.1, lat = 51.5, zoom = 9) %>%
# set base map
addProviderTiles("Stamen.TonerLite", options = providerTileOptions(noWrap = TRUE))
})
observe({
mapbounds <- input$mymap_bounds
mapzoom <- input$mymap_zoom
if(is.null(input$mymap_bounds)){
# no map bounds so render nothing
}
else if(mapzoom >= 11 & mapzoom <= 13){
# Zoomed out so render one thing based on map bounds
}
else if(mapzoom >= 14){
# Zoomed in so show render something else based on map bounds
}
else
# really zoomed out so render nothing
# plot map
proxy <- leafletProxy("mymap")
# remove old layers
proxy %>% clearShapes()
#render new layers
proxy %>% addPolygons(data = data)
})
})
这很好,但是当用户在地图上快速平移/缩放时,应用会滞后,因为每次地图边界更改时,它都会加载一整串不同的地图视图。这可能会导致崩溃并下载大量不必要的数据。
是否有可能调整观察功能,以使观察之间的延迟短,或者甚至更好的一种方法来检测用户在四处摇摄和停止摇摄并希望加载数据的用户之间的差异?
您可以使用shiny::debounce
:
例如
bound_change < - reactive({input$mymap_bounds})
bound_change_delay < - debounce(bound_change, 1000)
observe({
mapbounds <- bound_change_delay()