rshinyr-leaflet

Problem with displaying markers on the map leaflet


I have data frame with lat, long, names and average score of some universities. I need the map to display universities whose score is in the range specified through the slider.

I write this, but I don't understand why it doesn't work. If you remove the filtering, then everything works fine.

ui <- fluidPage( 
  
  leafletOutput("mymap"),
  fluidRow(
    column(4,
           
           # Copy the line below to make a slider bar 
           sliderInput("slider", label = h3("Выберите средний баллы"), min = 0, 
                       max = 800, value = c(100, 800)
    )
    )
  )
)

# Define server logic required to draw a histogram
server <- function(input, output) {
  
   filtered_universities = reactive({universities %>% filter( 
     aver_greV >= input$slider[1] & aver_greV <=  input$slider[2]
    )
    })
    output$mymap <- renderLeaflet({
     mymap <- leaflet() %>% setView (lat = -73.985, lng = 40.748, zoom = 13) 
    
     leaflet(data = filtered_universities()) %>% addTiles() %>% addMarkers()
      #  mymap
    })
   
}



# Run the application 
shinyApp(ui = ui, server = server)


Solution

  • It will be easier to answer with an extract of your data. You can do dput(head(universities)) to post an extract.

    I think your app doesn't work because you are trying to alter an existing map. To modify an existing map, you need to use leafletProxy in an observe or observeEvent, something like the following code should work : (but without an extract of your data I cannot test, so I am not sure)

    server <- function(input, output) {
      
      filtered_universities = reactive({universities %>% filter( 
        aver_greV >= input$slider[1] & aver_greV <=  input$slider[2]
      )
      })
      output$mymap <- renderLeaflet({
        leaflet() %>% setView (lat = -73.985, lng = 40.748, zoom = 13) %>% addTiles()
      })
      
      observe({
        leafletProxy('mymap') %>%
          clearMarkers() %>%
          addMarkers(data = filtered_universities())
      })
    }
    

    Edit : here is a working complete minimal example with some fake data

    universities <- data.frame(
      lat = c(0,1,0,1), 
      lng = c(0,1,1,0),
      var = c(0,1,2,3)
    )
    
    ui <- fluidPage( 
      leafletOutput("mymap"),
      sliderInput("slider", label = "Slider", min = 0, max = 3, value = c(0, 3))
    )
    
    server <- function(input, output) {
      output$mymap <- renderLeaflet({
        leaflet() %>% setView (lat = 0, lng = 1, zoom = 5) %>% addTiles()
      })
    
      observe({
        df = universities %>% filter(var >= input$slider[1], var <= input$slider[2])
        leafletProxy('mymap') %>%
          clearMarkers() %>%
          addMarkers(data = df)
      })
    }
    
    shinyApp(ui = ui, server = server)