如何在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
相关产品推荐
相关产品推荐

