R Shiny Leaflet移除特定图层问题:T1New图层无法显示
Alright, let's tackle this problem head-on. The core issue here is that clearMarkers() wipes out all markers on the map—including your T1New overlay group. Since you never re-add the T1New markers after clearing, the layer control loses track of that group entirely, making it unselectable.
The fix is straightforward: assign your dynamic markers (T0New and filtered MapData) to a dedicated group, then use clearGroup() instead of clearMarkers() to only remove that specific group. This way, your T1New overlay stays intact and the layer control works as intended.
Here's the revised full code with all necessary fixes:
library(shiny) library(leaflet) library(leaflet.extras) library(tidyverse) library(sf) # Create T0New data (fixed: added date_start_min column since your filter relies on it) lat <- c(49.823, 58.478, 57.478, 45.823) lng <- c(-10.854,-10.854,2.021,2.02) date_start_min <- c(125,135,168,149) T0New <- data.frame(lat, lng, date_start_min) # Added missing date column # Create T1New data lat <- c(48.956, 56.356, 57.445, 45.253) lng <- c(-9.762,-8.884,1.971,2.17) T1New <- data.frame(lat,lng) ui <- fluidPage( leafletOutput("map", height = "50vh"), plotOutput("distribPlot", height = "47vh", brush = brushOpts(id = "distribPlot_brush", direction = "x", resetOnNew = FALSE)) ) server <- function(input, output, session) { # Filter data based on plot brush selection filteredGraphData <- reactive({ currentlyFiltered <- T0New if(!is.null(input$distribPlot_brush)){ thisSel <- input$distribPlot_brush currentlyFiltered <- currentlyFiltered %>% filter(date_start_min >= thisSel$xmin, date_start_min <= thisSel$xmax) } return(currentlyFiltered) }) # Initial map render output$map <- renderLeaflet({ leaflet() %>% addProviderTiles(providers$CartoDB.Positron) %>% addLayersControl( position = "bottomright", overlayGroups = "T1New", options = layersControlOptions(collapsed = F) ) %>% hideGroup("T1New") %>% # Assign T0 markers to a dedicated group for targeted clearing addCircleMarkers( data = T0New, lat = ~lat, lng = ~lng, radius = 4, color = 'red', stroke = FALSE, fillOpacity = 1, group = "T0Group" # New: dedicated group for T0-related markers ) %>% # Keep T1 markers in their overlay group addCircleMarkers( data = T1New, lat = ~lat, lng = ~lng, radius = 5, color = 'blue', stroke = FALSE, fillOpacity = 1, group = "T1New" ) }) # Update map when filtered data changes observe({ mapData <- filteredGraphData() mapProxy <- leafletProxy("map", session = session) # Only clear the T0Group, not all markers mapProxy %>% clearGroup("T0Group") %>% # Add back full T0 set as small black markers addCircleMarkers( data = T0New, lat = ~lat, lng = ~lng, radius = 1, color = 'black', stroke = FALSE, fillOpacity = 1, group = "T0Group" # Assign to same group ) %>% # Add filtered subset as red markers addCircleMarkers( data = mapData, lat = ~lat, lng = ~lng, radius = 4, color = 'red', stroke = FALSE, fillOpacity = 1, group = "T0Group" # Assign to same group ) }) # Density plot output output$distribPlot <- renderPlot({ ggplot(T0New, aes(date_start_min)) + geom_density(col = "#053144", fill = "#43a2ca", alpha = 0.3, adjust = 0.75) }) } shinyApp(ui = ui, server = server)
Key Changes Explained:
- Added missing
date_start_minto T0New: Your original code tried to filter on this column but it wasn't included in the T0New data frame—this was causing a silent error that broke filtering. - Dedicated
T0Group: All T0-related markers (initial, filtered, and full set) are assigned toT0Group. This lets us target exactly which markers to clear without touchingT1New. - Replaced
clearMarkers()withclearGroup("T0Group"): This preserves theT1Newoverlay group, so the layer control can still toggle it on/off. - Simplified
filteredGraphData: Removed unnecessarynoSelectionchecks to keep the logic clean, and always return a valid dataset.
Now your T1New layer control will work as expected, and the map will update correctly when you brush the plot!
内容的提问来源于stack exchange,提问作者Oscar Jnn

