我有一个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)
})
})
这很好用,但是当用户在地图上快速平移/缩放时,应用会滞后,因为每次地图边界发生变化时,它会加载一整套不同的地图视图。这可能会导致崩溃并下载大量不必要的数据。
是否可以调整观察功能,以便观察之间有短暂的延迟,或者更好的方法来检测用户平移和已停止平移并希望加载数据的用户之间的差异?
答案 0 :(得分:0)
您可以使用shiny::debounce
:
例如
bound_change < - reactive({input$mymap_bounds})
bound_change_delay < - debounce(bound_change, 1000)
observe({
mapbounds <- bound_change_delay()