首页 > 解决方案 > Shiny Leaflet - 在不知道其 ID 的情况下删除特定标记或形状

问题描述

我有一个闪亮的应用程序,其中包含一个充满各种元素的传单地图:多边形、折线、标记......包含要在地图上显示的元素的数据框是通过查询数据库获得的。每次用户在地图上移动(左、右、上、下、缩放、取消缩放)时,数据框都会更改。

这里的问题是:如何仅显示数据框中的元素而没有:

我不能使用 aremoveShape()因为我不知道数据框中有哪些元素,并且在用户移动后不再存在。

我必须解决这个问题的一个想法是找到一种方法来获取地图上显示的所有元素的ID(layerId)的值,然后删除所有不在当前数据集中的元素。但这是否有可能在某个地方获得地图上当前显示元素的所有 ID 的信息?

或者另一种想法是使用与removeShape()(=删除所有形状,除了其ID在参数中传递的形状)相反的函数,但我不知道这样的函数是否存在?

这是一个小的reprex示例。我有一个带标记的闪亮应用程序。如果我点击一个按钮,我会从我的数据集中删除 3 个标记。我希望将它们从地图中删除,但不清除所有其他标记。

library(shiny)
library(leaflet)

data("quakes")
df <- quakes
df$id <- 1:nrow(df)

markers_to_remove <- c(159, 15, 888)

ui <- fluidPage(
           leafletOutput("map"),
           actionButton("btn", "Remove markers")
)

server <- function(input, output, session) {
    
df <- reactiveValues(markers = df)

# Init map
output$map <- renderLeaflet({
    leaflet() %>%
        addProviderTiles(provider = providers$CartoDB.Positron) %>%
        setView(lat = -20.9, lng =  169.84, zoom = 8)
})

# Display markers data
# I need to avoid the markers "blink" produced by clearMarkers()
# But I need to not display anymore the markers that are not in 
# df$markers anymore
observe({
    leafletProxy("map") %>%
        # clearMarkers() %>% # 
        addMarkers(
            data = df$markers,
            layerId = ~id,
            label = ~id
        )
})

# Delete clicked marker from data
observeEvent(input$btn,{
    # I get my data from a query and I cannot know which markers
    # were in the dataframe and are not anymore
    new_markers_from_query <- df$markers[!(df$markers$id %in% markers_to_remove),]
    df$markers <- new_markers_from_query

})

}
shinyApp(ui = ui, server = server)

标签: rshinyleaflet

解决方案


寻址

这是否可以在某处获得地图上当前显示元素的所有 ID 的信息?

我们可以用 检索边界input$map_bounds,并相应地推断 ID。


推荐阅读