在传单

时间:2018-05-01 16:07:53

标签: r leaflet r-leaflet

我正在制作带弹出窗口的传单地图。弹出窗口提供所选多边形的ID信息。我遇到的问题是ID的字段使用名称可以改变,所以我最初做的方式不再适用。

这是一个可重复的例子:

## preparing the RE:
library(maps); library(sf); library(leaflet); library(htmltools)
w = st_as_sf(map('world', plot = FALSE, fill = TRUE))

我用来做的是准备一个html字符串来显示:

text <- paste0("<b>ID %s</b>")

然后调用传单并使用sprintfhtmlEscape

填充弹出窗口
leaflet(data=w) %>% addTiles() %>% 
  addPolygons(
    popup = ~sprintf(
      text,
      htmlEscape(ID)
    )
  )

这非常有用: enter image description here

但是,该字段始终不会被称为ID,但该名称已知并且在r对象中(此处称为vari):

colnames(w) <- c("geometry", "country")
vari <- "country"

text <- paste0("<b>", vari, " %s</b>")
leaflet(data=w) %>% addTiles() %>% 
  addPolygons(
    popup = ~sprintf(
      text,
      htmlEscape(vari)
    )
  )

这不起作用: enter image description here

我已尝试使用as.name,因此它会被视为符号,但它不起作用:

vari <- as.name("country")

text <- paste0("<b>", vari, " %s</b>")
leaflet(data=w) %>% addTiles() %>% 
  addPolygons(
    popup = ~sprintf(
      text,
      htmlEscape(vari)
    )
  )
Error in sprintf(text, htmlEscape(vari)) : 
  invalid type of argument[1]: 'symbol'

知道如何解决这个问题吗?顺便说一句,我的HTML比我的例子更复杂(使用更多变量,但是,所有其他变量名都是固定的,只有ID字段更改)。

1 个答案:

答案 0 :(得分:1)

我不确定这是否属于您之后的情况,但听起来您希望能够简单地使用不一定具有该列的数据填充任何弹出窗口名称ID,但只是标题不可知的标识符?那么在这种情况下country?我担心这是一个丑陋的作弊,但鉴于你的数据结构包含一个data.frame,其中coords实际上是一个列表结构,我只是测试数据帧列的类,无论哪个是字符,使用它作为索引并直接调用< / p>

leaflet(data=w) %>% addTiles() %>% 
  addPolygons(
    popup = ~sprintf('<b>ID %s</b>', w[[names(which(mapply(is.character, w)))]])
  )

enter image description here