在传单中使用动态弹出窗口
Using dynamic popups in 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>")
然后调用传单并使用 sprintf
和 htmlEscape
填充弹出窗口
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 字段发生变化)。
我不确定这是否是您想要的,但听起来您希望能够简单地使用不一定具有名称 [=11] 的列中的数据填充任何弹出窗口=],但仅仅是一个与标题无关的标识符?那么在这种情况下 country
?我担心这是一个丑陋的作弊,但鉴于您的数据结构包含一个 data.frame,其中坐标实际上是一个列表结构,我只是测试 class 的数据框列,以字符为准,将其用作索引并直接调用
leaflet(data=w) %>% addTiles() %>%
addPolygons(
popup = ~sprintf('<b>ID %s</b>', w[[names(which(mapply(is.character, w)))]])
)
我正在制作带有弹出窗口的传单地图。弹出窗口提供所选多边形 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>")
然后调用传单并使用 sprintf
和 htmlEscape
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 字段发生变化)。
我不确定这是否是您想要的,但听起来您希望能够简单地使用不一定具有名称 [=11] 的列中的数据填充任何弹出窗口=],但仅仅是一个与标题无关的标识符?那么在这种情况下 country
?我担心这是一个丑陋的作弊,但鉴于您的数据结构包含一个 data.frame,其中坐标实际上是一个列表结构,我只是测试 class 的数据框列,以字符为准,将其用作索引并直接调用
leaflet(data=w) %>% addTiles() %>%
addPolygons(
popup = ~sprintf('<b>ID %s</b>', w[[names(which(mapply(is.character, w)))]])
)