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

如何在RShiny中解析selectInput(multiple=TRUE)的多数据源输入?

解决R Shiny多选数据源的读取问题

这事儿我之前做类似项目时也遇到过,改起来其实很简单,还能顺便优化代码的扩展性,完美适配你后续要加的10+个样本!

第一步:更新UI的selectInput

先把selectInput的multiple参数设为TRUE,同时可以调整默认选中项(比如默认选1个或多个),后续加新样本直接在choices里追加就行:

selectInput("sample", 
            label = h4("Select pre-loaded data to view"), 
            choices = c('sample 1', 'sample 2'), # 后续加样本直接在这里加,比如'sample 3'...
            selected = 'sample 1', 
            multiple = TRUE)

第二步:重构Server端的数据读取逻辑

原来的if-else只支持单个样本,现在input$sample会变成一个字符向量(比如用户选了sample1和sample2,input$sample就是c("sample 1", "sample 2"))。我们可以用lapply批量处理每个选中的样本,再写个小辅助函数让代码更整洁,方便后续扩展:

# 先写一个辅助函数,根据样本名称读取对应的两个CSV文件
get_sample_data <- function(sample_name) {
  # 把"sample 1"转换成"sample1"格式,用来匹配文件名
  sample_id <- gsub(" ", "", sample_name)
  df <- read.csv(paste0(sample_id, ".csv"))
  umap_df <- read.csv(paste0(sample_id, "_umap.csv"))
  return(list(df = df, umap = umap_df))
}

# 重构load_data reactive函数
load_data <- reactive({
  # 遍历所有选中的样本,批量读取数据
  lapply(input$sample, get_sample_data)
})

为什么这么写?

  • 扩展性拉满:后续加新样本时,只需要在UI的choices里加新名称(比如'sample 3'),同时把sample3.csv和sample3_umap.csv放到同目录,代码完全不用改!
  • 结构清晰:返回的是一个列表,每个元素对应一个选中样本的df和umap数据,后续生成对比图表时,用purrr::map或者循环就能批量处理每个样本的图表。

举个例子,如果你要生成每个样本的UMAP图,可以这么写(用ggplot的话):

output$umap_plots <- renderUI({
  plots <- purrr::map(load_data(), function(sample_data) {
    ggplot(sample_data$umap, aes(x = UMAP1, y = UMAP2)) + geom_point()
  })
  # 把多个图表排成一行或一列
  do.call(tagList, plots)
})

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.07 21:18:14