【问题标题】:Using dynamic popups in leaflet在传单中使用动态弹出窗口
【发布时间】:2018-05-01 16:07:53
【问题描述】:

我正在制作带有弹出窗口的传单地图。弹出窗口提供了正在选择的多边形的 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)
    )
  )

这很好用:

但是,该字段并不总是称为 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)
    )
  )

这不起作用:

我尝试过使用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 字段会更改)。

【问题讨论】:

  • 你的意思是有些国家的名字是一个叫做“ID”的字段,而其他国家的名字是一个叫做“国家”的字段或其他什么?也许这是一个愚蠢的问题,但有没有一种方法可以让您首先标准化您的数据,这样您就不必处理这个问题了?
  • 对不起,如果我不清楚,这个字段可以被称为不同的东西,比如“ID”、“国家”、“支付”等。我想标准化可能会起作用,我会的如果我找不到更好的解决方案,请这样做。谢谢。

标签: r leaflet r-leaflet


【解决方案1】:

我不确定这是否是您所追求的,但听起来您希望能够使用不一定具有名称 ID 的列中的数据简单地填充任何弹出窗口,但是仅仅是一个与标题无关的标识符吗?那么在这种情况下country?我担心这是一个丑陋的作弊,但鉴于您的数据结构包含一个 data.frame ,其中坐标实际上是一个列表结构,我只是测试类的数据框列,无论哪个是字符,将其用作索引并直接调用

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

【讨论】:

  • 这行得通。这确实是一种丑陋的作弊;),但它解决了我的问题,非常感谢!
  • 甜蜜。如果您想扩展场景,我们可以清理它哈哈
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-12-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多