【问题标题】:labels in leaflet r with HTML tags带有 HTML 标签的传单 r 中的标签
【发布时间】:2018-06-28 14:52:06
【问题描述】:

所有善良的灵魂,需要帮助。我正在创建一张传单地图,但无法解决一个奇怪的标签问题。我创建了带有少量变量的标签,如果第一个变量是数字,则标签呈现正常,但如果第一个变量是字符串,它们会失败 - 知道有什么问题吗? 让我们从一个虚拟的 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"))

现在我们(m)应用一个简单的 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 标签,而不是标签。它有什么问题?

【问题讨论】:

    标签: html r leaflet r-leaflet


    【解决方案1】:

    在玩弄了代码之后,我发现在 purrr 包中将 mapply() 替换为 map2() 可以解决问题。我不完全确定为什么会这样。 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"))
    

    【讨论】:

    • 剩下的唯一挑战是如何在其上使用 html 转义,但处理它是另一个查询。答案完美解决了我的问题
    • 有人想复制它以解决他们的挑战时的警告词 - map2 仅适用于 2 个参数,它不适用于任何其他数量的参数
    • 您需要使用语法稍有不同的 pmap(参数作为列表,您将它们称为 ..1,..2,..3),所以 pmap(list("L", 1,"W"),~htmltools::HTML(sprintf("

      %s

      %s %s",..1,..2,..3))))
    • @Slav 这对未来的读者来说是一个很好的说明。谢谢你。
    猜你喜欢
    • 2012-10-27
    • 1970-01-01
    • 2013-08-08
    • 1970-01-01
    • 2019-04-29
    • 1970-01-01
    • 2015-06-28
    • 2020-09-07
    • 2017-05-23
    相关资源
    最近更新 更多