使用HTML标签在Leaflet R中添加标签

3

各位好心人,需要帮助。我正在创建一个leaflet地图,并且无法解决标签的奇怪问题。我使用了一些变量创建标签,如果第一个变量是数字,则标签会正常呈现,但如果第一个变量是字符串,则失败了 - 有什么想法吗?让我们从一个虚拟spdf开始:

library(htmltools)
library(sp)
library(leaflet)

df <- new("SpatialPointsDataFrame", data = structure(list(PMID = c(184397, 184397), SPACEID = c("184397_1", "184397_2")), .Names = c("PMID", "SPACEID"), row.names = 1:2, class = "data.frame"), coords.nrs = numeric(0), coords = structure(c(-0.14463936, -0.14468822, 51.50726534, 51.50730171), .Dim = c(2L, 2L), .Dimnames = list(c("1", "2"), c("x", "y"))), bbox = structure(c(-0.14468822, 51.50726534, -0.14463936, 51.50730171), .Dim = c(2L, 2L), .Dimnames = list(c("x", "y"), c("min", "max"))), proj4string = new("CRS", projargs = "+proj=longlat +datum=WGS84 +no_defs +ellps=WGS84 +towgs84=0,0,0"))

现在我们应用一条简单的HTML代码行(原先使用了df行,但不是必须的,可以简化为

df@data$HT<-mapply(function(x,y){htmltools::HTML(sprintf("<h2>%s</h2> %s",x,y))},1,"L", SIMPLIFY = F) 

这个例子本来可以正常工作。但是如果我们将顺序反过来——从 (1,"L") 改为 ("L",1)——它就会失败:

df@data$HT<-mapply(function(x,y){htmltools::HTML(sprintf("<h2>%s</h2> %s",x,y))},"L",1, SIMPLIFY = F) 

在第一个情况下,地图包含正确的标签,而在另一个情况下,它会生成空标签。
leaflet() %>%
addTiles() %>%
addMarkers(data = df, label = ~ HT)

如果我使用label = ~as.character(HT),它会产生一个逐字HTML标签,但不是标签。这是什么问题?
1个回答

5
在研究代码后,我发现在purrr包中用map2()替换mapply()可以解决这个问题。我不确定为什么会这样。Slav和我都确认这个解决方案在我们的机器上有效。
library(sp)
library(leaflet)
library(htmltools)
library(purrr)

df@data$HT1 <- map2(1, "L", ~htmltools::HTML(sprintf("<h2>%s</h2> %s",.x,.y))) 
df@data$HT2 <- map2("L", 1, ~htmltools::HTML(sprintf("<h2>%s</h2> %s",.x,.y))) 

leaflet()%>%
addProviderTiles("OpenStreetMap.Mapnik") %>%
addLabelOnlyMarkers(data = df, label = ~HT2, 
                    labelOptions = labelOptions(noHide = TRUE, direction = 'center',
                                                textOnly = FALSE, textsize = "15px"))

enter image description here enter image description here


唯一剩下的挑战就是如何在其中使用HTML转义,但这是另一个需要处理的问题。答案完美地解决了我的问题。 - Slav
警告:当有人想复制它来解决问题时,请注意 - map2 仅适用于2个参数,不能与任何其他数量的参数一起使用。 - Slav
你需要使用稍微不同的语法(将参数作为列表,并将它们引用为..1,..2,..3)来使用pmap函数。因此,可以使用以下代码:pmap(list("L",1,"W"),~htmltools::HTML(sprintf("<h2>%s</h2> %s %s",..1,..2,..3))) - Slav
@Slav,这对未来的读者来说是一条很好的提示。谢谢你。 - jazzurro

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接