Shiny应用中Leaflet Proxy结合observeEvent更新异常问题
问题解决:Shiny地图全取消选择后标记残留
问题根源
当checkboxGroupInput的所有选项被取消时,input$projectEX会变为NULL,而observeEvent默认参数ignoreNULL = TRUE,导致事件不再触发,地图上保留了最后一次选择的标记,没有执行清空和更新操作。
修改方案
- 在
observeEvent中添加ignoreNULL = FALSE,确保全取消选择时事件仍能触发 - 当
input$projectEX为空时,仅执行清空标记操作,不再添加新标记
修改后的完整代码
UI部分
library(shiny) library(shinydashboard) library(tidyverse) library(leaflet) library(rgdal) library(leafgl) library(sf) ui <- dashboardPage( dashboardHeader(title = "Basic dashboard"), dashboardSidebar( checkboxGroupInput( inputId="projectEX", label= "select project", choices = unique(df$Project), selected = unique(df$Project), inline = TRUE ) ), dashboardBody( fluidRow( leafletOutput("map01", width = "100%",height= "600px") ) ) )
Server部分
server <- function(input, output) { output$map01 <- renderLeaflet({ leaflet() %>% setView(lat = 55,lng = 7,zoom = 4 ) %>% addProviderTiles("OpenStreetMap.Mapnik",options = providerTileOptions(noWrap = TRUE))%>% addGlPoints(data = pts, fillColor = cols, popup = TRUE, group="External Layout") }) observeEvent(input$projectEX, { # 处理全取消选择时的NULL值 selected_projects <- if(is.null(input$projectEX)) character(0) else input$projectEX map_layout <- df %>% dplyr::filter(Project %in% selected_projects) proxy <- leafletProxy("map01") %>% leaflet::clearMarkers() # 仅当有选中项目时才添加标记 if(length(selected_projects) > 0){ proxy <- proxy %>% addBootstrapDependency() %>% addGlPoints(data = pts, fillColor = cols, popup = TRUE,group = "pts")%>% addMarkers(data = map_layout, lng = ~lon, lat = ~lat) } }, ignoreNULL = FALSE) # 关键设置:允许NULL触发事件 } shinyApp(ui, server)
global.r代码(保持不变)
df1 = structure(list(lon = c(2.198533, 2.072667, 1.765167, 1.7576, 1.74505, 2.0371, 2.072083, 1.968417, 2.0164, 1.972417, 2.76213322, 2.76214658, 2.76215994, 2.7619378, 2.76195036, 2.7621882, 2.76174424, 2.76175893, 2.76153788, 2.76155105, 7.193523, 7.192891, 7.19408, 7.188541, 7.170463, 7.182107, 7.188373, 7.175124, 7.17449, 7.186017, 6.08929788, 6.07133495, 6.06850258, 6.05336589, 6.05053853, 6.04769791, 6.03540684, 6.03256901, 6.0297334, 6.02688322), lat = c(53.864733, 53.8292, 53.845083, 53.892433, 53.903783, 53.899517, 53.867583, 53.8865, 53.842767, 53.8452, 52.56579362, 52.57695936, 52.58812507, 52.59915544, 52.61045596, 52.62107368, 52.63210354, 52.64299945, 52.65375103, 52.6649166, 55.116223, 55.109455, 55.102346, 55.092805, 55.093697, 55.083025, 55.078856, 55.07562, 55.067577, 55.064098, 54.66623968, 54.67250461, 54.6603614, 54.67877577, 54.66663221, 54.65447923, 54.68504457, 54.67290028, 54.66074696, 54.64860216 ), Project = c("A", "A", "A", "A", "A", "A", "A", "A", "A", "A", "B", "B", "B", "B", "B", "B", "B", "B", "B", "B", "C", "C", "C", "C", "C", "C", "C", "C", "C", "C", "D", "D", "D", "D", "D", "D", "D", "D", "D", "D")), class = "data.frame", row.names = c(NA, -40L)) pts = st_as_sf(df1, coords = c("lon", "lat"), crs = 4326) cols = topo.colors(nrow(pts)) df = structure(list(lon = c(2.198533, 2.072667, 1.765167, 1.7576, 1.74505, 2.0371, 2.072083, 1.968417, 2.0164, 1.972417, 2.76213322, 2.76214658, 2.76215994, 2.7619378, 2.76195036, 2.7621882, 2.76174424, 2.76175893, 2.76153788, 2.76155105, 7.193523, 7.192891, 7.19408, 7.188541, 7.170463, 7.182107, 7.188373, 7.175124, 7.17449, 7.186017 ), lat = c(53.864733, 53.8292, 53.845083, 53.892433, 53.903783, 53.899517, 53.867583, 53.8865, 53.842767, 53.8452, 52.56579362, 52.57695936, 52.58812507, 52.59915544, 52.61045596, 52.62107368, 52.63210354, 52.64299945, 52.65375103, 52.6649166, 55.116223, 55.109455, 55.102346, 55.092805, 55.093697, 55.083025, 55.078856, 55.07562, 55.067577, 55.064098), Project = c("A", "A", "A", "A", "A", "A", "A", "A", "A", "A", "B", "B", "B", "B", "B", "B", "B", "B", "B", "B", "C", "C", "C", "C", "C", "C", "C", "C", "C", "C" )), class = "data.frame", row.names = c(NA, -30L))
内容的提问来源于stack exchange,提问作者Haribo
相关产品推荐
相关产品推荐

