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

如何用SelectInput()实现RShiny物种-数据列联动下拉选择

实现RShiny中基于物种选择的联动下拉菜单

以下是无需修改原有数据框即可实现联动下拉菜单的完整方案,同时支持后续Plotly时序图绘制:

完整可运行代码

library(shiny)
library(plotly)

# 原始数据
Haddock_age1length <- c("33", "34", "32")
Haddock_weight <- c("14", "16", "15")
squid_width <- c("30", "32", "34")
squid_weight <- c("10", "11", "15")
Year <- c("2000", "2001", "2002")

df <- data.frame(Haddock_age1length, Haddock_weight, squid_width, squid_weight, Year,
                 stringsAsFactors = FALSE)

# 定义物种与数据列的映射(显示名称 -> 实际列名)
species_col_map <- list(
  "Haddock" = list(
    display_names = c("Age 1 Length", "Weight"),
    col_names = c("Haddock_age1length", "Haddock_weight")
  ),
  "Squid" = list(
    display_names = c("Width", "Weight"),
    col_names = c("squid_width", "squid_weight")
  )
)

ui <- fluidPage(
  titlePanel("物种数据趋势"),
  sidebarLayout(
    sidebarPanel(
      selectInput(inputId = "species",
                  label = "选择物种:",
                  choices = c("Haddock", "Squid")),
      selectInput(inputId = "data_type",
                  label = "选择数据类型:",
                  choices = NULL) # 初始为空,动态更新
    ),
    mainPanel(
      plotlyOutput("trend_plot")
    )
  )
)

server <- function(input, output, session) {
  
  # 监听物种选择,动态更新数据类型下拉框
  observe({
    selected_sp <- input$species
    updateSelectInput(session,
                      inputId = "data_type",
                      label = paste(selected_sp, "数据类型:"),
                      choices = species_col_map[[selected_sp]]$display_names,
                      selected = species_col_map[[selected_sp]]$display_names[1])
  })
  
  # 响应式获取选中的数据列
  selected_data <- reactive({
    req(input$data_type)
    # 通过显示名称匹配实际列名
    target_col <- species_col_map[[input$species]]$col_names[
      species_col_map[[input$species]]$display_names == input$data_type
    ]
    data.frame(Year = df$Year,
               Value = as.numeric(df[[target_col]]))
  })
  
  # 绘制Plotly时序折线图
  output$trend_plot <- renderPlotly({
    plot_ly(selected_data(), x = ~Year, y = ~Value, type = "scatter", mode = "lines+markers") %>%
      layout(title = paste(input$species, "-", input$data_type, "年度趋势"),
             xaxis = list(title = "年份"),
             yaxis = list(title = input$data_type))
  })
}

shinyApp(ui, server)

核心实现逻辑

  1. 映射表定义:
    用species_col_map建立物种、用户友好的显示名称、数据框实际列名三者的关联,避免修改原数据结构,同时解决显示名与列名不一致的问题。

  2. 联动下拉框更新:
    通过observe()监听第一个下拉框的选择变化,调用updateSelectInput()动态替换第二个下拉框的选项列表,确保选项与当前选中物种匹配。

  3. 数据关联与绘图:
    在响应式函数selected_data()中,根据用户选择的显示名称找到对应的数据列,转换为数值类型后传递给Plotly,生成动态时序图。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.20 21:57:33