Shiny嵌入Leaflet通过observer渲染时自定义聚合标记不显示问题
问题根因
你遇到的问题根源不是leafletProxy无法处理响应逻辑,而是clearMarkerClusters()仅会清除页面上可见的聚合标记,不会销毁底层的聚合图层实例,首次渲染生成的默认聚合图层配置会一直留存,后续自定义的iconCreateFunction不会在旧图层上生效。
可行解决方案
方案1:指定clusterId完整清理聚合图层
调用addMarkers时通过clusterId给聚合图层指定唯一标识,更新前先调用removeMarkerClusters()指定ID销毁整个聚合图层,而不是仅清空可见标记,同时补充clearMarkers()清理散落的单个标记,避免残留。
修改后的observer代码如下:
observe({ if (input$markers == "Type A") { leafletProxy(mapId = "map") %>% # 先销毁指定ID的聚合图层,再清空普通标记 removeMarkerClusters(clusterId = "quake_cluster") %>% clearMarkers() %>% addMarkers(data = quakes, lng = ~long, lat = ~lat, clusterId = "quake_cluster", # 固定聚合图层ID clusterOptions = markerClusterOptions()) } else { leafletProxy(mapId = "map") %>% removeMarkerClusters(clusterId = "quake_cluster") %>% clearMarkers() %>% addMarkers(data = quakes, lng = ~long, lat = ~lat, clusterId = "quake_cluster", clusterOptions = markerClusterOptions(iconCreateFunction = JS("function (cluster) { return new L.Icon({iconUrl: 'https://nicocriscuolo.github.io/resistancebank_plots/markers/marker_3D.png', iconSize: [18, 27], iconAnchor: [10, 26], shadowUrl: 'https://nicocriscuolo.github.io/resistancebank_plots/markers/shadow-marker_3D.png', shadowSize: [26, 39], shadowAnchor: [5, 28]});}"))) } })
方案2:预注册聚合配置
如果切换频率较高,可以把两种聚合的图标创建函数提前在地图初始化时注入到前端JS上下文,避免动态添加时JS函数未解析的问题,同时通过leafletProxy调用前端方法切换聚合样式,性能会更优。
内容的提问来源于stack exchange,提问作者nd091680
相关产品推荐
相关产品推荐

