r - Shiny Leaflet - 在不知道其 ID 的情况下删除特定标记或形状
问题描述
我有一个闪亮的应用程序,其中包含一个充满各种元素的传单地图:多边形、折线、标记......包含要在地图上显示的元素的数据框是通过查询数据库获得的。每次用户在地图上移动(左、右、上、下、缩放、取消缩放)时,数据框都会更改。
这里的问题是:如何仅显示数据框中的元素而没有:
- 删除所有先前显示的元素(因此不使用
clearGroup()
或类似功能) - 将前一个数据帧保存在内存中
我不能使用 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)
解决方案
寻址
这是否可以在某处获得地图上当前显示元素的所有 ID 的信息?
我们可以用 检索边界input$map_bounds
,并相应地推断 ID。
推荐阅读
- google-cloud-functions - 在 Google Cloud Functions 上部署 DialogFlow CX webhook 时出错:“错误:监听 EADDRINUSE:地址已在使用 :::8080”
- css - SCSS / SASS中有两个父母时如何选择第二个父母
- python - 如何根据特定的日期持续时间选择数据?
- javascript - 背景图像高度 100% 或 100vh 问题
- javascript - 将 PHP 字符串显示为 HTML 表格?
- node.js - Stripe 节点 - 在结账时使用折扣券后计算申请费
- python - 比 plotly dash Store 中的 json 更快的序列化(泡菜、镶木地板、羽毛……)?
- checkbox - 复选框下拉内容部分不适用于所有复选框
- database - 对 JDBC 请求应用断言
- c# - 努力使用 MongoDriver 返回任务并捕获错误