R使用lapply/map执行函数报错:无法读取输入列表或写入输出文件
问题排查与修复方案
现存问题梳理
singlet_cleaned列表初始化时机错误:你在执行第一部分清洗逻辑之前就调用list.files查找_cleaned.csv文件,此时文件还未生成,因此该列表为空,第二部分的合并逻辑没有输入文件可用map2函数找不到错误:map2属于purrr包,虽然tidyverse默认会加载该包,若出现加载失败的情况可以显式用purrr::map2调用- 自定义函数名冲突:你定义了名为
match的函数,和R内置的match()函数重名,容易引发不可预期的错误,建议修改函数名 - 文件名配对可靠性差:仅靠两个文件列表的自然顺序配对,很容易出现文件顺序错位的问题,建议通过文件名前缀主动关联配对文件
修正后的完整代码
### 导入PCR结果.tsv,格式化、自然排序后导出清洗后的.csv文件 ### 导入重复样本.tsv,拆分样本列后和清洗后的数据合并,导出最终结果 ## 环境配置,按需修改工作路径,未安装tidyverse先执行安装 # setwd("C:/Users/asmit/Desktop/pratice_files/pratice/") # install.packages("tidyverse") library(tidyverse) ### 第一步:批量清洗原始实验数据 # 匹配所有原始实验数据文件(排除_replicates.tsv) singlet_files <- list.files(path = ".", pattern = "^(?!.*_replicates\\.tsv).*\\.tsv$", perl = TRUE) # 定义读取原始文件的函数 read_singlet <- function(x) { as_tibble(read_tsv(x, col_names = TRUE, skip = 1)) } # 定义清洗并导出的函数 singlet_cleanup <- function(x) { new_file <- str_replace(x, "(.*)\\.tsv", "\\1_cleaned.csv") read_singlet(x) %>% select("Pos", "Name", "Cp", "Concentration") %>% .[str_order(.$Pos, numeric = TRUE), ] %>% write_csv(file = new_file) return(new_file) } # 执行清洗,得到所有清洗后文件的路径列表 singlet_cleaned <- lapply(singlet_files, singlet_cleanup) %>% unlist() ### 第二步:批量合并重复样本均值和清洗后的数据 # 匹配所有重复样本均值文件 matching_pair_files <- list.files(path = ".", pattern = "_replicates\\.tsv$") # 定义读取清洗后文件的函数 read_cleaned <- function(y) { as_tibble(read_csv(y, col_names = TRUE)) } # 定义读取重复样本文件的函数(修改函数名避免和内置函数冲突) read_rep_file <- function(m) { as_tibble(read_tsv(m, col_names = TRUE, skip = 1)) } # 定义合并导出函数 merge_and_export <- function(m, y) { organ <- regmatches(m, regexpr("(Liver|Lung|Kidney|Spleen)", m)) output_file <- str_replace(m, "(.*)_replicates\\.tsv", "\\1_final.csv") read_rep_file(m) %>% mutate("R1" = gsub(x = .$Samples, pattern = "^(.*),.*", replacement = "\\1")) %>% mutate("R2" = gsub(x = .$Samples, pattern = ".*,\\s(.*)", replacement = "\\1")) %>% pivot_longer(cols = c("R1", "R2"), names_to = "Well Pairs", values_to = "Wells") %>% select("MeanCp", "STD Cp", "Mean conc", "STD conc", "Wells") %>% relocate("Wells", 1) %>% right_join(read_cleaned(y), by = c("Wells" = "Pos")) %>% .[str_order(.$Wells, numeric = TRUE), ] %>% select("Name", "MeanCp", "STD Cp", "Mean conc", "STD conc") %>% distinct(Name, .keep_all = TRUE) %>% add_column(Organ = organ) %>% write_csv(file = output_file) return(output_file) } # 执行批量合并,显式调用purrr::map2避免找不到函数的问题 purrr::map2(.x = matching_pair_files, .y = singlet_cleaned, ~merge_and_export(.x, .y))
额外优化说明
- 调整了文件匹配的正则表达式,用负向预查精准排除重复样本文件,避免误匹配
- 主动返回生成的文件路径,确保后续步骤的输入列表准确
- 所有函数名都做了语义化修改,避免和内置函数冲突
内容的提问来源于stack exchange,提问作者allisonrs
相关产品推荐
相关产品推荐

