【发布时间】:2020-11-25 14:01:40
【问题描述】:
我有一个闪亮的应用程序,其中包含一个充满各种元素的传单地图:多边形、折线、标记...... 包含要在地图上显示的元素的数据框是通过查询数据库获得的。 每次用户在地图上移动(左、右、上、下、缩放、取消缩放)时,数据框都会更改。
这里的问题是:如何只显示数据框中的元素而不显示:
- 删除所有以前显示的元素(因此不使用
clearGroup()或类似功能) - 将前一个数据帧保存在内存中
我不能使用removeShape(),因为我不知道数据框中有哪些元素,并且在用户移动后不再存在。
我必须解决这个问题的一个想法是找到一种方法来获取地图上显示的所有元素的ID(layerId)的值,然后删除所有不在当前数据集中的元素。 但这是否有可能在某个地方获得地图上当前显示元素的所有 ID 的信息?
或者另一种想法是使用与removeShape() 相反的函数(= 删除所有形状,除了在参数中传递 ID 的形状)但我不知道这样的函数是否存在?
这里有一个小例子。 我有一个带标记的闪亮应用程序。 如果我点击一个按钮,我会从我的数据集中删除 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)
【问题讨论】: