web-dev-qa-db-fra.com

R et dépliant: comment organiser le texte de l'étiquette sur plusieurs lignes

Supposons que vous ayez la trame de données suivante:

cities = data.frame( name = c('Madrid','Barcelona','Sevilla'),
                 country = c('Spain','Spain','Spain'),
                 region = c('Comunidad de Madrid','Cataluña','Andalucia'),
                 data = c(100, 200, 300), 
                 lng = c(-3.683333,2.166667,-6.083333),
                 lat = c(40.433333,41.383333,37.446667))

Mon idée est d'avoir une carte de ces villes et des étiquettes qui pourraient afficher des informations pertinentes lors du survol des cercles de villes correspondants. J'aimerais que le texte de l'étiquette soit organisé en plusieurs lignes. La toute première approche ci-dessous a échoué:

library( leaflet )

map = leaflet( cities ) %>%
addTiles() %>%
addCircles( lng = ~lng, lat = ~lat, fillColor = 'darkBlue', radius = 10000, 
          stroke = FALSE, fillOpacity = 0.8, label = paste0( cities$name,'\n', cities$region, '\n', cities$country, '\n', cities$data ) )

ainsi que d'autres tentatives similaires. Après avoir googlé un moment, j'ai trouvé une solution possible en impliquant le package htmltools:

library( htmltools )
map2 = leaflet( cities ) %>%
addTiles() %>%
addCircles( lng = ~lng, lat = ~lat, fillColor = 'darkBlue', radius = 10000, 
          stroke = FALSE, fillOpacity = 0.8, 
          label = HTML( paste0( '<p>', cities$name, '<p></p>', cities$region, ', ', cities$country,'</p><p>', cities$data, '</p>' ) ) )

Dans ce cas, les informations sont affichées comme je le souhaiterais mais, dans le même libellé, il existe une entrée pour chaque ville de l'ensemble de données. Comment pourrais-je faire pour disposer le texte d'une seule ville en plusieurs lignes? Toute aide sera grandement appréciée

21
LuPi

Créez d'abord un vecteur de caractères de contenu html pour chaque ville, puis encapsulez-le dans un appel lapply pour définir l'attribut HTML pour un affichage correct lors de la définition de l'attribut label dans adCircles

labs <- lapply(seq(nrow(cities)), function(i) {
  paste0( '<p>', cities[i, "name"], '<p></p>', 
          cities[i, "region"], ', ', 
          cities[i, "country"],'</p><p>', 
          cities[i, "data"], '</p>' ) 
})

map2 = leaflet( cities ) %>%
  addTiles() %>%
  addCircles(lng = ~lng, lat = ~lat, fillColor = 'darkBlue', radius = 10000, 
              stroke = FALSE, fillOpacity = 0.8,
              label = lapply(labs, htmltools::HTML))

map2
25
TimSalabim