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

Shiny+Leaflet乌克兰电厂地图无响应问题求助

问题修复方案

核心问题分析

你的代码存在几个关键问题导致筛选功能失效:

  • 未将响应式表达式赋值给变量,导致筛选逻辑完全未被调用
  • filter 函数的条件写法错误,多值匹配需要用 %in% 而非逗号分隔
  • renderLeaflet 始终使用原始数据集,未关联筛选后的响应式数据
  • 下拉选项包含重复值,影响用户体验

修正后的完整代码

library(shiny)
library(dplyr)
library(leaflet)

# 乌克兰中心坐标
UkraineLatitude <- 48.383022
UkraineLongitude <- 31.1828699

# 读取数据(替换xxx为实际文件路径)
DS_Power_Plants <- read.csv("xxx")
Power_Plants_UKR <- filter(DS_Power_Plants, country == "UKR")

ui <- fluidPage(
  titlePanel("乌克兰发电厂地图"),
  sidebarLayout(
    sidebarPanel(
      selectInput("PlantType",
                  "按燃料类型筛选发电厂",
                  # 使用unique获取不重复的燃料类型选项
                  choices = unique(Power_Plants_UKR$primary_fuel),
                  selected = NULL,
                  multiple = TRUE)
    ),
    mainPanel(leafletOutput(outputId = "Plantmap"))
  )
)

server <- function(input, output) {
  
  # 定义响应式筛选数据集,赋值给变量以便调用
  filtered_plants <- reactive({
    # 处理未选择任何类型的情况:返回全部数据
    if (is.null(input$PlantType)) {
      Power_Plants_UKR
    } else {
      # 使用%in%匹配多个选中的燃料类型
      Power_Plants_UKR %>% filter(primary_fuel %in% input$PlantType)
    }
  })

  output$Plantmap <- renderLeaflet({
    # 使用响应式筛选后的数据集
    leaflet(filtered_plants()) %>%
      addTiles() %>%
      # 设置初始地图中心为乌克兰
      setView(lng = UkraineLongitude, lat = UkraineLatitude, zoom = 6) %>%
      addMarkers()
  })
}

shinyApp(ui = ui, server = server)

关键修改说明

  1. 响应式表达式赋值:将筛选逻辑赋值给 filtered_plants,后续通过 filtered_plants() 调用实时更新的数据
  2. 正确的筛选条件:用 primary_fuel %in% input$PlantType 实现多值匹配,替代错误的逗号分隔写法
  3. 空选择处理:添加判断逻辑,当用户未选择任何燃料类型时显示全部发电厂
  4. 去重下拉选项:用 unique() 处理燃料类型选项,避免重复值
  5. 地图初始视图:添加 setView() 让地图默认聚焦乌克兰区域

内容的提问来源于stack exchange,提问作者Luke

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.07 13:10:45