Щелкнув маркер листовки, вы перейдете к URL
Есть ли в пакете листовок для R способ щелкнуть маркер и перейти по URL-адресу?*
Вот решение JS.
В R, чтобы добавить всплывающее окно с URL-адресом:
library(leaflet)
content <- paste(sep = "<br/>",
"<b><a href='http://www.samurainoodle.com'>Samurai Noodle</a></b>"
)
leaflet() %>% addTiles() %>%
addPopups(-122.327298, 47.597131, content,
options = popupOptions(closeButton = FALSE)
)
Также просто добавить маркер, который при нажатии предоставляет URL-адрес во всплывающем окне:
leaflet() %>% addTiles() %>%
addMarkers(-122.327298, 47.597131, popup = content,
options = popupOptions(closeButton = FALSE)
)
Возможно, что-то обычай передан в листовку ...
?
Наконец, как пользовательская функция JS может отображать разные URL-адреса для каждого маркера карты? Рассмотрим пример data.frame:
df <- data.frame(url = c("https://stackru.com/questions/tagged/python",
"https://stackru.com/questions/tagged/r")),
lng = c(-122.327298, -122.337298),
lat = c(47.597131,47.587131))
* Это уже задавалось ранее, но я снова задаю вопрос здесь и привожу минимальный воспроизводимый пример.
1 ответ
Вы могли бы использовать htmltools
или htmlwidgets
добавить onclick
событие с javascript:
Решение 1) с htmltools
:
library(leaflet)
map <- leaflet() %>%
addTiles() %>%
addMarkers(-122.327298, 47.597131, popup = 'LINK',
options = popupOptions(closeButton = FALSE)
)
library(htmltools)
browsable(
tagList(
list(
tags$head(
tags$script(
'
document.addEventListener("DOMContentLoaded", function(){
var marker = document.getElementsByClassName("leaflet-pane leaflet-marker-pane");
var openLink = function() {
window.open("https://www.stackru.com")
};
marker[0].addEventListener("click", openLink, false);
})
'
)
),
map
)
)
)
Решение 2 - с htmlwidgets:
library(leaflet)
library(htmlwidgets)
leaflet() %>%
addTiles() %>%
addMarkers(-122.327298, 47.597131, popup = 'LINK',
options = popupOptions(closeButton = FALSE)
) %>%
onRender('
function(el, x) {
var marker = document.getElementsByClassName("leaflet-pane leaflet-marker-pane");
var openLink = function() {
window.open("https://www.stackru.com")
};
marker[0].addEventListener("click", openLink, false);
}
')
Разные URL для каждого маркера:
Это грязный подход и показывает общий путь. Мне не хватает времени, чтобы снова освоиться с замыканиями в JS, чтобы добавить цикл.
Можно было посмотреть здесь: addEventListener, использующий цикл for и передачу значений. А данные могут быть переданы из R в JS с помощью функции onRender. Может быть, я снова найду время на выходных, или вы / кто-то добавит эту часть. Не стесняйтесь оставлять вопрос открытым,..
jsCode <- paste0('
function(el, x) {
var marker = document.getElementsByClassName("leaflet-marker-icon leaflet-zoom-animated leaflet-interactive");
marker[0].onclick=function(){window.open("https://stackru.com/questions/tagged/python");};
marker[1].onclick=function(){window.open("https://stackru.com/questions/tagged/r");};
}
')
library(leaflet)
library(htmlwidgets)
leaflet() %>%
addTiles() %>%
addMarkers(lng = df$lng, lat = df$lat, popup = 'LINK',
options = popupOptions(closeButton = FALSE)
) %>%
onRender(jsCode)