Reputation: 53
I am attempting to produce a Leaflet map in which the marker colors change based on the user selecting a variable from the data set using varSelectInput()
. Below is the reprex as well as what I have tried already and articles I have referenced.
library(shiny)
library(tidyverse)
dat <- tibble(
state = c("lak", "cent", "east", "east"),
option_1 = c("no", "yes", "no", "yes"),
option_2 = c("yes", "yes", "yes", "yes"),
option_3 = c("no", "no", "no", "yes"),
lat = c(6.87239, 4.01313, 5.00959, 4.77239),
lon = c(29.57524, 30.56462, 32.39547, 33.59156)
)
pal <- colorFactor(
palette = c("#FF0000", "green4"),
levels = c("no", "yes")
)
ssd_map <- leaflet() %>%
addProviderTiles(providers$CartoDB) %>%
setView(lng = 31.2189853,
lat = 7.8751893,
zoom = 6)
ui <- fluidPage(
titlePanel("Reprex Map"),
mainPanel(
varSelectInput(
inputId = "option",
label = "Options:",
data = dat %>% select(starts_with("option_"))
),
leafletOutput("map")
))
server <- function(input, output) {
output$map <- renderLeaflet({
ssd_map
})
observe({
leafletProxy("map", data = dat) %>%
clearMarkers() %>%
addCircleMarkers(data = dat,
color = ~pal(input$option)) #Causes the app to crash or non-reactive markers
})
}
shinyApp(ui = ui, server = server)
What I have tried:
Adding !!, !!as.name(), !!!, before input$option in the color parameter of addCircleMarkers()
to ensure it is not reading a character string, but a symbol. However, if I use any of those, the app crashes and I get a warning "Error in !: invalid argument type". If I don't add those, the app runs, but the markers are grey and non-reactive to input$option
Using observeEvent({})
(I'm uncertain that I'm using it 100% correctly), though it seems that this is more for usage with buttons, not when you want the map to update as soon as the input option is changed.
This topic and this topic seem to be the closest to my problem, but there was no solution posted. I've also looked extensively on SO without success.
Upvotes: 1
Views: 1054
Reputation: 53
As per @Ben in the comments above, using the following for the observe()
section worked perfectly.
observe({
leafletProxy("map", data = dat) %>%
clearMarkers() %>%
addCircleMarkers(data = dat,
color = ~pal(eval(as.symbol(input$option))))
})
Upvotes: 1