介绍
今天有位同事问我怎么在某次循环报错后仍然可以继续程序运行,最后我们使用了trycatch模块。
代码解读
任务:在循环中,如果某次循环的calc
出现错误则跳过这次循环并重新赋值结果
res_list <- list() # 创建一个空列表来存储结果
for (i in Taxa) {
tryCatch({
fit <- calc(data %>%
filter(Taxa == i) %>%
select(-Taxa) %>%
column_to_rownames("KO") %>%
rownames_to_column("KO"),
annotation = 1)
abundance <- asDataFrame(fit, "abundance")
abundance$Taxa <- i
res_list[[i]] <- abundance
}, error = function(e) {
cat("An error occurred in processing Taxa:", i, "\n")
cat("Error message:", conditionMessage(e), "\n")
res_list[[i]] <- NULL
})
}
# 移除可能由于错误而留下的空值
res_list <- res_list[!sapply(res_list, is.null)]
# 合并结果
res <- do.call(rbind, res_list)
这里使用了 tryCatch 来捕获可能发生错误的代码块。如果calc
函数在某次循环中报错,错误信息将被打印出来,并且会继续进行下一次循环,同时重置 res_list[[i]] 的值为空值,以确保不会保留之前循环中的错误结果。最后,移除可能留下的空值,并将结果合并成一个大的数据框架 res。