Использование динамических всплывающих окон в буклете

Я делаю карту листовок с всплывающими окнами. Всплывающие окна предоставляют информацию об идентификаторе выбранного полигона. Моя проблема заключается в том, что имя поля, используемого для идентификатора, может измениться, поэтому способ, которым я изначально занимался, больше не работает.

Вот воспроизводимый пример:

## 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).


person Bastien    schedule 01.05.2018    source источник
comment
Вы имеете в виду, что некоторые страны имеют свое название в виде поля с именем ID, а другие - в виде поля под названием Country или что-то еще? Может быть, это глупый вопрос, но есть ли способ сначала стандартизировать свои данные, чтобы вам не приходилось с этим сталкиваться?   -  person camille    schedule 01.05.2018
comment
Извините, если я неясно выразился, это поле, которое может называться по-разному, например, идентификатор, страна, оплата и т. д. Думаю, стандартизация может сработать, я сделаю это, если не найду лучшего решения. Спасибо.   -  person Bastien    schedule 01.05.2018


Ответы (1)


Я не уверен, что это то, что вам нужно, но похоже, что вы хотите иметь возможность просто заполнить любое всплывающее окно данными из столбца, который не обязательно имеет имя ID, а просто не зависит от идентификатора титула? Итак, в данном случае country? Я боюсь, что это уродливый чит, но, учитывая, что ваша структура данных содержит data.frame, где координаты на самом деле являются структурой списка, я просто проверяю столбцы dataframe для класса, в зависимости от того, какой символ, использую это как индекс и напрямую вызываю

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

введите здесь описание изображения

person Carl Boneri    schedule 01.05.2018
comment
Это работает. это действительно уродливый чит ;), но он решает мою проблему, так что спасибо! - person Bastien; 01.05.2018
comment
сладкий. Если вы хотите расширить сценарии, мы могли бы их почистить, ха-ха. - person Carl Boneri; 01.05.2018