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

如何在Shiny中实现selectInput联动,动态更新选项并过滤绘图

Shiny联动selectInput实现分组数据过滤绘图

下面是实现你需求的完整示例代码,用mtcars数据集模拟业务场景,你可以直接替换成自己的数据集:

library(shiny)
library(ggplot2)

# 模拟你的数据集(替换成实际数据)
data <- mtcars
# 给分组变量设置更贴合需求的名称
data$group <- factor(data$cyl)
data$sample <- factor(data$gear)

ui <- fluidPage(
  titlePanel("分组密度图"),
  sidebarLayout(
    sidebarPanel(
      # 第一个选择框:选择分组变量
      selectInput("group_var", "选择分组变量", choices = c("group", "sample")),
      # 第二个动态生成的选择框:选择分组水平
      uiOutput("level_select")
    ),
    mainPanel(
      plotOutput("density_plot")
    )
  )
)

server <- function(input, output, session) {
  # 动态生成第二个选择框的选项
  output$level_select <- renderUI({
    # 确保第一个选择框有值后再生成选项
    req(input$group_var)
    # 从数据中提取选中分组变量的所有水平
    level_choices <- unique(data[[input$group_var]])
    selectInput("selected_level", "选择分组水平", choices = level_choices)
  })
  
  # 绘制过滤后的密度图
  output$density_plot <- renderPlot({
    # 确保两个选择框都有值
    req(input$group_var, input$selected_level)
    # 过滤数据:仅保留选中分组水平的行
    filtered_data <- data[data[[input$group_var]] == input$selected_level, ]
    # 绘制密度图(这里用mpg列,替换成你的目标数值列)
    ggplot(filtered_data, aes(x = mpg)) +
      geom_density(fill = "#2c3e50", alpha = 0.7) +
      labs(title = paste("分组", input$group_var, "水平", input$selected_level, "的密度分布"),
           x = "数值变量", y = "密度") +
      theme_minimal()
  })
}

shinyApp(ui, server)

关键逻辑说明

  • 动态UI生成:用renderUI和uiOutput组合实现第二个选择框的动态更新。req(input$group_var)确保第一个选择框有选中值后才执行后续逻辑,避免初始化时的报错。
  • 数据过滤:通过data[[input$group_var]]动态引用选中的分组列,再筛选出等于input$selected_level的行,实现仅绘制目标分组水平的数据。
  • 适配多水平场景:不管group或sample有多少个水平,第二个选择框都会自动加载对应选项,解决了硬编码无法适配动态数据的问题。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.14 21:05:36