user2772619
user2772619

Reputation: 13

r - Shiny+leaflet: How to set Markers color depend on user input

I added points on a map using shiny and leaflet. Each point is a different type of transit option. I want to distinguish the different types by color and couldn't figure this out. Tried using "if" which doesn't work. Thanks!

This is the basic code I have

library(leaflet)
ui <- fluidPage(
leafletOutput("map"),
headerPanel("Example"),
sidebarPanel(checkboxGroupInput(inputId = "Type", label = "Data 
Layer",choices = c("Bike", "Muni", "Bus", "BART"), selected = "Bike")))

server <- function(input, output) {
output$map <- renderLeaflet({

rownumber = which(Stops_and_stations$Type == input$Type)
x <- Stops_and_stations[rownumber,]

leaflet(width = 1000, height = 500) %>% 
  addTiles() %>% 
  addCircleMarkers(lng = x$stop_lon,
                   lat = x$stop_lat,
                   radius= 3, color = '#ff6633') %>% 
  setView(lng = -122.4000,
          lat = 37.79500,
          zoom = 13)
})
}
shinyApp(ui, server)

And this is what I tried to add .....

 if(input$Type == "Bike"){

leaflet(width = 1000, height = 500) %>% 
  addTiles() %>% 
  addCircleMarkers(lng = x$stop_lon,
                   lat = x$stop_lat,
                   radius= 3, color = '#ff6633') %>% 
  setView(lng = -122.4000,
          lat = 37.79500,
          zoom = 13)
}

if(input$Type == "Muni"){

leaflet(width = 1000, height = 500) %>% 
  addTiles() %>% 
  addCircleMarkers(lng = x$stop_lon,
                   lat = x$stop_lat,
                   radius= 3, color = '#0033ff') %>% 
  setView(lng = -122.4000,
          lat = 37.79500,
          zoom = 13)
}

.....

Upvotes: 1

Views: 2247

Answers (1)

GyD
GyD

Reputation: 4072

It would be much easier to answer to your question if you provided Stops_and_stations and thus made it a reproducible example..

One approach to use distinct colors for different groups is to add a color column to your data.frame:

Since we don't know your data, I created some random dataset.

Stops_and_stations <- data.frame(
  Type = rep(c("Bike", "Muni", "Bus", "BART"), each = 10),
  stop_lon = -runif(40, 122.4200, 122.4500),
  stop_lat = runif(40, 37.76800, 37.78900),
  color = rep(c("Red", "Blue", "Green", "Yellow"), each = 10)
)

Then instead of specifying a concrete color such as #ff6633, you can use the color column.

addCircleMarkers(lng = x$stop_lon,
                       lat = x$stop_lat,
                       radius= 3, color = x$color)

I would also like to point out that your subsetting is not right: you are using checkboxGroupInput which can have more values, so you need to use the %in% operator to filter.

x <- Stops_and_stations[Stops_and_stations$Type %in% input$Type,]

Upvotes: 2

Related Questions