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

如何在Shiny中用selectInput过滤数据?响应式访问报错求助

问题解决

报错原因

直接在server函数的顶层(非响应式上下文)访问了响应式值input$district,Shiny要求响应式值必须在reactive()、observe()或者渲染函数(比如renderLeaflet())这类响应式消费者内部使用。

修正方案

将数据过滤逻辑封装到reactive()表达式中,让数据能跟随下拉选择的变化自动更新,同时符合Shiny的响应式规则。

修正后的完整代码

library(shiny)
library(sf)
library(sp)
library(tidyverse)
library(osrm)
library(leaflet)
library(dplyr)
library(geosphere)
library(readxl)

dst = c('A', 'B', 'C')

raw1 <- read_xlsx("raw_map.xlsx")
clean1 <- read_xlsx("clean_map.xlsx")

ui <- fluidPage(
    titlePanel("District data viz"),
    sidebarLayout(
        sidebarPanel(
            selectInput("district",
                         "Name of the dst:",
                         choices = dst),
        ),
        mainPanel(
          fluidRow(column(12, leafletOutput("raw"))),
          fluidRow(column(12, leafletOutput("clean"))),
        )
    )
)

server <- function(input, output) {
  # 用reactive封装过滤后的数据,响应input变化
  filtered_raw <- reactive({
    dplyr::filter(raw1, district == input$district)
  })
  
  filtered_clean <- reactive({
    dplyr::filter(clean1, district == input$district)
  })
  
  output$raw <- renderLeaflet({
    # 访问reactive数据需要加()
    raw_data <- filtered_raw()
    leaflet(data = raw_data) %>% 
      addTiles() %>% 
      addMarkers(lng = raw_data$lon, lat = raw_data$lat,
                 label = raw_data$CHE_Village,
                 popup = raw_data$CHE_Name,
                 labelOptions = labelOptions(noHide = T)) 
  })
  
  output$clean <- renderLeaflet({
    clean_data <- filtered_clean()
    leaflet(data = clean_data) %>% 
      addTiles() %>% 
      addMarkers(lng = clean_data$lon, lat = clean_data$lat,
                 label = clean_data$CHE_Village,
                 popup = clean_data$CHE_Name,
                 labelOptions = labelOptions(noHide = T)) 
  })
}    

shinyApp(ui = ui, server = server)

额外说明

  • 访问reactive对象时必须加上(),比如filtered_raw()才能获取实际数据
  • 修正了原代码中fluidRow(12, ...)的错误写法,改为column(12, ...)嵌套在fluidRow中
  • 用reactive封装数据的优势是数据仅过滤一次,多个输出可复用,提升运行性能

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.21 10:36:23