我有一个显示单张地图的闪亮应用程序。该应用程序的功能之一允许用户在地图上添加新的地理标记。但是,我想使这样的标记的弹出窗口在添加到地图上后就已经打开,但是始终保持使用“ x”按钮或通过单击地图将其关闭的可能性。
我已经阅读了传单文档的“标记”指南(“从图层继承的弹出方法”小节,很详细的指南显然没有R语言提供),并且找到了这个选项openPopup()
。不幸的是,这似乎不适用于我的代码。这是一个简单的例子:
library(leaflet)
leaflet() %>%
addTiles() %>%
addMarkers(lng = -100,
lat = 50,
popup = "ALE",
options = popupOptions(openPopup = TRUE))
预期的行为是此在线工具中显示的使用传单的行为。请尝试搜索地址,然后看看新标记会立即打开其自己的弹出窗口。
在此先感谢您的帮助!
我猜可能需要一些JavaScript,因为该接口似乎不支持此功能。
在一个闪亮的示例下面:
library(shiny)
library(leaflet)
library(shinyjs)
js_save_map_instance <- HTML(
paste(
"var mapsPlaceholder = [];",
"L.Map.addInitHook(function () {",
" mapsPlaceholder.push(this); // Use whatever global scope variable you like.",
"});", sep = "\n"
)
)
js_open_popup <- HTML(
paste("function open_popup(id) {",
" console.log('open popup for ' + id);",
" mapsPlaceholder[0].eachLayer(function(l) {",
" if (l.options && l.options.layerId == id) {",
" l.openPopup();",
" }",
" });",
"}", sep = "\n"
)
)
ui <- fluidPage(
tags$head(
tags$script(type = "text/javascript",
js_save_map_instance,
js_open_popup),
useShinyjs()
),
wellPanel(
fluidRow(
sliderInput("lng", "Longitude:", 10, 60, 35, 0.01),
sliderInput("lat", "Latitude:", 35, 75, 42.5, 0.01),
actionButton("add", "Add Marker")
)
),
fluidRow(
leafletOutput("map")
)
)
server <- function(input, output, session) {
map <- leaflet() %>%
addTiles() %>%
fitBounds(10, 35, 60, 75)
output$map <- renderLeaflet(
map
)
observeEvent(input$add, {
id <- paste0("marker", input$add)
leafletProxy("map") %>%
addMarkers(input$lng, input$lat, id,
"mymarkers",
popup = sprintf("%.2f / %.2f: %s", input$lng, input$lat,
id))
runjs(sprintf("setTimeout(() => open_popup('%s'), 10)", id))
})
}
shinyApp(ui, server)
leaflet.js
初始化后没有提供开箱即用的功能来检索地图实例。因此,我们必须使用一种变通方法来在初始化时显式保存映射。这是通过存储在中的JS代码完成的js_save_map_instance
。这个想法是从初始化后的Find Leaflet地图对象获取的。layerId
等于我们要查找的图层,则可以openPopup
在此图层上调用。(注意,理想情况下,我们可以直接访问该层(同样,我没有在API中找到任何功能),并且可以使用private _layer
属性,但是由于它是私有的,因此我使用循环方法。)open_popup
在shiny
侧面的正确位置调用。我需要添加一个小的延迟,以避免在添加标记之前调用函数。本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句