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

Shiny应用:基于多选下拉框实现表格多行生成

解决方案

核心逻辑

  • 第一步:通过第一个下拉框的选择过滤原始数据集
  • 第二步:将过滤后的数据与第二个下拉框选中的所有选项做笛卡尔积(即每行数据与每个选中选项配对),替换目标列(示例中的gear)为选中的选项值

修改后的完整代码

#----- Load libraries -----#
library(shiny)
library(shinydashboard)
library(shinyWidgets)
library(dplyr)
library(rhandsontable)

# Define UI for application 
ui <- fluidPage(
  dashboardPage(
    dashboardHeader(title="Draft"),
    dashboardSidebar(
      sidebarMenu(
        menuItem("Filtering Questions",
                 tabName = "questions",
                 icon = icon('question')
        ),
        menuItem("All Data",
                 tabName = "all_data",
                 icon=icon("table")
        )
      )
    ),
    dashboardBody(
      tabItems(
        tabItem(
          tabName = "questions",
          selectInput(
            inputId = 'q1',
            label = '1.) Choose carb',
            choices = unique(mtcars$carb),
            selected = unique(mtcars$carb)[1],
            multiple = TRUE
          ),
          br(),
          selectInput(
            inputId = 'q2',
            label = '2.) Choose gear',
            choices = unique(mtcars$gear),
            selected = unique(mtcars$gear)[1:2], # 默认选2个方便测试效果
            multiple = TRUE
        )),
        tabItem(
          tabName = "all_data",
          rHandsontableOutput("all_table")
        )
      )))

# Define server logic 
server <- function(input, output) {
  
  mtcars_filter = reactive({
    # 第一步:用q1的选择过滤原始数据
    filtered_data <- mtcars %>% filter(carb %in% input$q1)
    
    # 第二步:处理q2的选择,生成笛卡尔积并替换gear列
    if(!is.null(input$q2) && length(input$q2) > 0){
      # 创建包含选中gear选项的表格
      gear_options <- tibble(gear = as.integer(input$q2))
      # 笛卡尔积合并,自动为每行数据生成对应每个选中gear的新行
      result_data <- cross_join(filtered_data, gear_options)
    } else {
      # 若q2未选中任何值,返回原始过滤数据
      result_data <- filtered_data
    }
    
    return(result_data)
  })
  
  #----------All Data Table----------#
  output$all_table=renderRHandsontable({
    req(mtcars_filter()) # 确保数据存在后再渲染表格
    
    my_table = rhandsontable(mtcars_filter()) %>%
      hot_col(c(1:11), readOnly = TRUE) %>%
      hot_context_menu(allowRowEdit = FALSE, allowColEdit = FALSE) %>%
      hot_table(highlightCol = TRUE, highlightRow = TRUE)
    
    return(my_table)
  })
}

# Run the application 
shinyApp(ui = ui, server = server)

关键代码说明

  1. 笛卡尔积实现:使用dplyr::cross_join()将过滤后的数据与选中的gear选项表合并,自动为每行数据生成对应每个选中gear的新行,完全匹配需求中的“每多选中一个选项新增一行”
  2. 空值处理:添加判断逻辑,避免q2未选中任何值时出现程序错误
  3. 类型匹配:将input$q2转为整数类型(与mtcars的gear列类型一致),保证数据格式统一

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.30 09:25:21