You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Shiny应用中Leaflet Proxy结合observeEvent更新异常问题

问题解决:Shiny地图全取消选择后标记残留

问题根源

当checkboxGroupInput的所有选项被取消时,input$projectEX会变为NULL,而observeEvent默认参数ignoreNULL = TRUE,导致事件不再触发,地图上保留了最后一次选择的标记,没有执行清空和更新操作。

修改方案

  1. 在observeEvent中添加ignoreNULL = FALSE,确保全取消选择时事件仍能触发
  2. 当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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.07 17:05:18