Search code examples
rshinyreactiver-leaflet

How to update fillColor palette to selected input in shiny map?


I am having trouble transitioning my map from static to reactive so a user can select what data they want to look at. Somehow I'm not successfully connecting the input to the dataframe. My data is from a shapefile and looks roughly like this:

 NAME  Average      Rate                       geometry
1  Alcona 119.7504 0.1421498 MULTIPOLYGON (((-83.88711 4...
2   Alger 120.9212 0.1204398 MULTIPOLYGON (((-87.11602 4...
3 Allegan 128.4523 0.1167062 MULTIPOLYGON (((-85.54342 4...
4  Alpena 114.1528 0.1410852 MULTIPOLYGON (((-83.3434 44...
5  Antrim 124.8554 0.1350004 MULTIPOLYGON (((-84.84877 4...
6  Arenac 127.8809 0.1413534 MULTIPOLYGON (((-83.7555 43...

In the server section below, you can see that I tried to use reactive to get the selected variable and when I write print(select) it does print the correct variable name, but when I try to put it into the colorNumeric() function it's clearly not being recognized. The map I get is all just the same shade of blue instead of different shades based on the value of the variable in that county.


ui <- fluidPage(
  fluidRow(
    selectInput(inputId="var",
                label="Select variable",
                choices=list("Average"="Average",
                             "Rate"="Rate"),
                selected=1)
  ),
  fluidRow(
    leafletOutput("map")
  )
)

server <- function(input, output, session) {
  # Data sources
  counties <- st_read("EITC_counties.shp") %>%
    st_transform(crs="+init=epsg:4326")
  counties_clean <- select(counties, NAME, X2020_Avg., X2020_Takeu)
  counties_clean <- counties_clean %>%
    rename("Average"="X2020_Avg.",
           "Rate"="X2020_Takeu")
  # Map
  variable <- reactive({
    input$var
  })
  output$map <- renderLeaflet({
    select <- variable()
    print(select)
    pal <- colorNumeric(palette = "Blues", domain = counties_clean$select, na.color = "black")
    color_pal <- counties_clean$select
    leaflet()%>%
    setView( -84.51, 44.18, zoom=5) %>%
    addPolygons(data=counties_clean, layerId=~NAME,
                weight = 1, smoothFactor=.5, 
                fillOpacity=.7, 
                fillColor=~pal(color_pal()),
                highlightOptions = highlightOptions(color = "white", 
                                                    weight = 2,
                                                    bringToFront = TRUE)) %>%
    addProviderTiles(providers$CartoDB.Positron)
  })
}

shinyApp(ui, server)

I've tried making the reaction into an event and also using the observe function using a leaflet proxy but it only produced errors. I also tried to skip the reactive definition and just put input$var directly into the palette (counties_clean$input$var), but it similarly did not show any color variation.

When I previously created a static map setting the palette using counties_clean$Average it came out correctly, but replacing Average with a user input is where I appear to be going wrong. Let me know if I can share any additional clarification.


Solution

  • Unfortunately, your code is not reproducible without the data, but the mistake is most likely in this line

    color_pal <- counties_clean$select
    

    What this line does, is to extract a column named select from your data. This column is not existing, so it will return NULL.

    What you want though, is to extract a column whose name is given by the content of select, so you want to try:

    color_pal <- counties_clean[[select]]