代码之家  ›  专栏  ›  技术社区  ›  Slav

带有HTML标记的传单r中的标签

  •  3
  • Slav  · 技术社区  · 7 年前

    所有善良的灵魂,需要帮助。我正在创建传单地图,无法解决标签的奇怪问题。我用很少的变量创建了标签,如果第一个变量是数字,标签可以呈现,但是如果第一个变量是字符串,标签就会呈现失败-知道问题出在哪里吗? 让我们从一个虚拟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标记,但不生成标签。怎么了?

    1 回复  |  直到 7 年前
        1
  •  5
  •   jazzurro    7 年前

    在仔细研究代码之后,我发现 mapply() 具有 map2() 在purrr包中实现了这个技巧。我不完全清楚为什么会这样。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