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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.03 12:27:04