如何用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)
核心实现逻辑
映射表定义:
用species_col_map建立物种、用户友好的显示名称、数据框实际列名三者的关联,避免修改原数据结构,同时解决显示名与列名不一致的问题。联动下拉框更新:
通过observe()监听第一个下拉框的选择变化,调用updateSelectInput()动态替换第二个下拉框的选项列表,确保选项与当前选中物种匹配。数据关联与绘图:
在响应式函数selected_data()中,根据用户选择的显示名称找到对应的数据列,转换为数值类型后传递给Plotly,生成动态时序图。
内容的提问来源于stack exchange,提问作者Jamie_B
相关产品推荐
相关产品推荐

