Изменить цвет существующих полигонов в функции 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