R语言如何对匹配文件列表批量应用自定义函数进行处理?
问题根源
- 第一:自定义函数存在逻辑错误,你定义了
data2作为第二个传入参数,但函数内部merge操作硬编码使用了closest_dist变量名,完全没有用到传入的data2参数,所以函数运行时会强制到全局环境查找closest_dist变量,找不到就会触发报错。 - 第二:
lapply用法错误,lapply的第二个参数需要传入函数本身,你直接写create_distance_to_strand(annotation, closest_dist, "proof.csv")相当于先执行该函数,把返回结果传给lapply,不符合批量调用的要求。同时批量处理需要对应不同的输出文件名,不能写死为同一个proof.csv。
修正代码
首先修正自定义函数的内部逻辑:
create_distance_to_strand <- function(data, data2, nameCsv) { newData <- data %>% select(seqnames, start, end, V4, seqnames, geneStart, geneEnd, geneStrand, distanceToTSS, SYMBOL, geneLength)%>% rename(peak = V4) # 把硬编码的closest_dist替换为参数data2 joined_df <- merge(newData , data2, by.x = "peak", by.y = "peak", all.x = TRUE, all.y = TRUE) %>% drop_na() write.table(joined_df , nameCsv, sep = "\t", row.names = FALSE) return(joined_df) }
再修正批量调用逻辑:
# 提前读入所有批次共用的annotation文件 annotation = read.csv("results_annotation", header = T, sep ="\t") # 匹配所有以closest开头的文件,加^限定前缀匹配更准确 files <- list.files(pattern = "^closest") # 批量循环处理 proof_list = lapply(files, function(current_file) { # 读入当前循环对应的closest文件 current_closest <- read.csv(current_file, header = T, sep ="\t") # 生成独立的输出文件名,避免覆盖 output_name <- paste0("result_", gsub("\\.", "_", current_file), ".csv") # 调用处理函数 create_distance_to_strand(data = annotation, data2 = current_closest, nameCsv = output_name) })
结果说明
运行后所有输出文件会以result_+原closest文件名的规则保存在当前工作目录下,proof_list是列表格式,每个元素对应一个closest文件处理后的结果数据框,可通过索引直接取用,例如proof_list[[1]]就是第一个文件的处理结果。
内容的提问来源于stack exchange,提问作者lana
相关产品推荐
相关产品推荐

