1

因此,我正在尝试创建美国所有县的等值线图,这些县将根据各种不同的变量(例如失业率、贫困率等)进行着色。

下面是我的代码:

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 教程页面上,他们提到了 htmlwidgets 中的 onRender() 函数作为引入 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

4

0 回答 0