Изменить цвет существующих полигонов в функции Render htmlWidgets Leaflet

Поэтому я пытаюсь составить краткую карту всех округов в Соединенных Штатах, где округа будут окрашены на основе различных переменных (например, уровень безработицы, уровень бедности и т. Д.)

Ниже мой код:

library(shiny)
library(leaflet)
library(dplyr)
ui <- fluidPage("Mapping Characteristics of the USA",
           fluidRow(
                    column(10, leafletOutput("map")),
                    column(2, radioButtons(inputId = "radio", selected=character(0), label="Characteristics",
                                           choiceNames = c("Unemployment Rate", "% w/out high school education", "% w/out insurance"),
                                           choiceValues = c("uer", "no_hs_per", "no_insur")))))

server <- function(input, output, session)
{
  #Render the map
  output$map = renderLeaflet({leaflet(counties)})

   observeEvent(input$radio,
       { 
         #Create color function
         pal = colorBin(palette = topo.colors(10), domain = counties[[input$radio]], pretty=TRUE)

         #Redraw Map
         m = leafletProxy("map", session=session, data=counties) %>% clearShapes() %>%
           addPolygons(stroke=TRUE, weight=1, fillOpacity = 0.5, color = pal(counties[[input$radio]]))
       }) #End of observeEvent(input$radio, ...)
}

# Run the application 
shinyApp(ui = ui, server = server)

Проблема заключается в том, что каждый раз, когда пользователь нажимает на новую кнопку-переключатель, карта листовки перерисовывает весь слой многоугольника. Это может занять некоторое время, и это не создает плавного взаимодействия с пользователем. То, что я хотел бы сделать, это просто отредактировать цвет уже существующего многоугольного слоя.

Используя псевдокод, это может выглядеть примерно так...

#Create the map where every county is initially blue
output$map = renderLeaflet({
             leaflet(counties) %>% addPolygons(stroke=TRUE, weight=1, fillOpacity = 0.5, color = "blue", group="Counties")
 })

observeEvent(input$radio,
 {
    #Create color function
    pal = colorBin(palette = topo.colors(10), domain = counties[[input$radio]], pretty=TRUE)

    #Edit the already existing counties group
    m = leafletProxy("map", session=session, data=counties) %>% setStyle(group = "Counties", newColor = pal(counties[[input$radio]]))
 })

Я считаю, что что-то подобное можно сделать, добавив немного Javascript. На странице учебного пособия Leaflet for R они упоминают функцию onRender() из htmlwidgets как способ представить Javascript ( https://rstudio.github.io/leaflet/morefeatures.html).

На странице документации для пакета Leaflet Javascript есть также функция setStyle(), которая, я думаю, будет делать то, что я хочу (пример ее использования можно найти здесь http://leafletjs.com/examples/choropleth/).

Единственная проблема в том, что я безнадежно растерялся, когда дело доходит до Javascript. Если бы кто-то мог указать мне правильное направление о том, как добавить Javascript в мой скрипт, чтобы он работал так, как я хочу, это было бы здорово.

Кроме того, если кто-то знает о каких-либо других пакетах, инструментах отображения и т. Д. Для создания нужной мне карты, которая может оказаться проще, чем то, что я сейчас делаю, я буду рад услышать о них.

Два примера того, что я хочу сделать: http://www.nytimes.com/projects/census/2010/explorer.html https://www.socialexplorer.com/a9676d974c/explore

0 ответов

Другие вопросы по тегам