Как программно создать список объектов класса иконок листовки? - PullRequest
0 голосов
/ 24 октября 2019

Как программно создать список объектов класса иконок листовки?

Я создал карту с использованием библиотеки leaflet, которая в конечном итоге покажет десятки местоположений. Для этого я хочу добавить несколько пользовательских значков, используя функцию addMarkers, которая берет iconSet, созданный с использованием iconList, как задокументировано здесь .

В приведенном ниже примере (в котором используются значки https://icon -library.net / ) создание myicons с помощью iconList, которое содержит два прямых вызоваmakeIcon, без проблем, потому что используются только две иконки. Однако в реальном мире количество значков, их URL и другие атрибуты не будут известны заранее.

Если создать список с помощью iconList и использовать cbind, чтобы прикрепить его к фрейму данных какВ новом столбце я получаю ожидаемое сообщение об ошибке «невозможно привести класс».

Похоже, мой единственный вариант - это программно создать список myicons, но использование чего-то вроде mynewicons <- iconList(sapply(1:nrow(df.data), function(i) {makeIcon(df.data$url[i],iconWidth = df.data$width[i],iconHeight = df.data$height[i])})) приводит к Arguments passed to iconList() must be icon objects returned from makeIcon()ошибка.

Как создать этот список значков листовок динамически, а не указав его заранее?

require(leaflet)
require(magrittr)

entrynames <- c("Entry 1","Entry 2")
lat <- c(51.509950,51.510736)
lng <- c(-0.1345093,-0.135190)
iconurl <- c("https://icon-library.net/images/right-arrow-icon-png/right-arrow-icon-png-9.jpg",
                "https://icon-library.net/images/back_previous_arrow_play_next_stop_pause_101040.png")
iconwidth <- c(60,50)
iconheight <- c(60,50)
df.data <- data.frame(entrynames=entrynames,lat=lat,lng=lng,
                      url=iconurl,width=iconwidth,height=iconheight,stringsAsFactors = FALSE)

df.data$entrynames <- as.character(df.data$entrynames)

myicons <- iconList(
    marker1 = makeIcon(iconUrl = df.data$url[1],iconWidth = df.data$width[1],iconHeight = df.data$height[1]),
    marker2 = makeIcon(iconUrl = df.data$url[2],iconWidth = df.data$width[2],iconHeight = df.data$height[2])
)

m <- leaflet() %>% setView(lng = -0.1345093, lat = 51.510090, zoom = 18) %>% addTiles() %>%
    addMarkers(data = df.data,
               lat = ~lat,
               lng = ~lng,
               icon = myicons)
m

Вывод MRE:

Custom markers in leaflet for R

1 Ответ

1 голос
/ 24 октября 2019

Это немного странно, и я не слишком знаком с листовкой, но использование purrr::map и purrr::flatten плюс исправление имен и атрибутов, кажется, работает:

require(leaflet)
#> Indlæser krævet pakke: leaflet
require(magrittr)
#> Indlæser krævet pakke: magrittr

entrynames <- c("Entry 1","Entry 2")
lat <- c(51.509950,51.510736)
lng <- c(-0.1345093,-0.135190)
iconurl <- c("https://icon-library.net/images/right-arrow-icon-png/right-arrow-icon-png-9.jpg",
             "https://icon-library.net/images/back_previous_arrow_play_next_stop_pause_101040.png")
iconwidth <- c(60,50)
iconheight <- c(60,50)
df.data <- data.frame(entrynames=entrynames,lat=lat,lng=lng,
                      url=iconurl,width=iconwidth,height=iconheight,stringsAsFactors = FALSE)

df.data$entrynames <- as.character(df.data$entrynames)

myicons <- iconList(
  marker1 = makeIcon(iconUrl = df.data$url[1],iconWidth = df.data$width[1],iconHeight = df.data$height[1]),
  marker2 = makeIcon(iconUrl = df.data$url[2],iconWidth = df.data$width[2],iconHeight = df.data$height[2])
)

mynewicons <- purrr::map(1:nrow(df.data), 
                         function(i) {
                           iconList(makeIcon(df.data$url[i],
                                             iconWidth = df.data$width[i],
                                             iconHeight = df.data$height[i])
                                    )
                           }
                         ) %>% 
  purrr::flatten()
names(mynewicons) <- glue::glue("marker{1:nrow(df.data)}")
attr(mynewicons, "class") <-  "leaflet_icon_set"
identical(myicons, mynewicons)
#> [1] TRUE

Создано в 2019-10-24 при представлении пакета (v0.3.0)

...