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

如何在R Shiny中使用多选selectInput显示数据表格?报错求助

Shiny多选筛选数据集报错解决

错误原因分析

  • 重复的Input ID:两个tabPanel中使用了相同的cyl和vs作为selectInput的ID,Shiny不允许同一会话内存在重复的输入ID,会导致输入值读取异常。
  • 多选输入的初始值判断错误:当selectInput设置multiple = T时,初始值为NULL,此时!(input$vs %in% "All")的判断会返回长度为0的逻辑值,无法作为if的判断条件,引发报错。
  • 数据类型不匹配:UI中将选项转为字符型,但原数据集mtcars的cyl和vs是数值型,直接用字符输入值和数值列比较会导致筛选失效。

修正后的完整代码

library(shiny)
library(ggplot2)  
library(dplyr)  
library(DT)

result_table <- mtcars

# UI部分:修改重复ID,统一数据类型,设置多选默认值
ui <- fluidPage(
  tabsetPanel(
    tabPanel("Import data",
             titlePanel("Test"),
             
             fluidRow(
               column(4,
                      selectInput("cyl_tab1", # 修改为唯一ID
                                  "cyl:",
                                  c("All", unique(result_table$cyl)), # 保持数值型选项
                                  selected = "All"
                      )
               ),
               column(4,
                      selectInput("vs_tab1", # 修改为唯一ID
                                  "vs:",
                                  c("All", unique(result_table$vs)), # 保持数值型
                                  multiple = TRUE,
                                  selected = "All" # 设置初始选中"All",避免NULL问题
                      )
               ),
             ),
             DT::dataTableOutput("table")
    ),
    tabPanel("test2",
             titlePanel("test"),
             
             fluidRow(
               column(4,
                      selectInput("cyl_tab2", # 唯一ID
                                  "cyl:",
                                  c("All", unique(result_table$cyl)),
                                  selected = "All"
                      )
               ),
               column(4,
                      selectInput("vs_tab2", # 唯一ID
                                  "vs:",
                                  c("All", unique(result_table$vs)),
                                  multiple = TRUE,
                                  selected = "All"
                      )
               ),
             )
    )
  )
)

# Server部分:修正筛选逻辑,处理多选和类型匹配
server <- function(input, output) {
  
  # Filter data based on selections
  output$table <- DT::renderDataTable(DT::datatable({
    data <- result_table 
    # 处理cyl筛选:先判断是否选了All,再统一转为数值比较
    if (input$cyl_tab1 != "All") {
      data <- data[data$cyl == as.numeric(input$cyl_tab1), ]
    }
    # 处理vs筛选:判断是否包含"All",如果包含则不筛选,否则用数值匹配
    if (!"All" %in% input$vs_tab1) {
      data <- data[data$vs %in% as.numeric(input$vs_tab1), ]
    }
    data
  }))
  
}

shinyApp(ui, server)

关键修改点说明

  1. 唯一Input ID:将两个tab中的cyl和vs分别改为cyl_tab1/cyl_tab2、vs_tab1/vs_tab2,避免ID冲突。
  2. 统一数据类型:选项不再转为字符型,保持与原数据集一致的数值型,筛选时用as.numeric()确保输入值和列类型匹配。
  3. 修正多选判断逻辑:直接判断"All"是否在多选输入的选中值里,同时给多选框设置selected = "All"作为初始值,避免NULL引发的判断错误。
  4. 加载DT包:代码中使用了DT的函数,需要明确加载library(DT)。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.05 16:15:07