在R的targets管道中使用tryCatch无法保留错误与成功结果的问题
问题描述
我正在构建一个R包,使用targets包系统化运行测试。预期会出现错误,希望targets的输出能保存错误(以及过程中生成的其他对象),而非在首个错误处终止管道运行。原本认为tryCatch可以实现该功能,但管道仍在首个错误处停止且未返回任何结果。
包含错误与tryCatch的简单管道代码
get_data <- function() { iris %>% filter(Species == "versicolor") } # 拟合可正常运行的模型 fit_model <- function(data) { mod <- lm(Sepal.Width ~ Sepal.Length, data) return(summary(mod)) } # 拟合会抛出错误的模型,用tryCatch保存错误信息 fit_model_try <- function(data) { lm_mod <- tryCatch( { lm(Sepal.Width ~ ERRRRRRR, data) }, error=function(cond) { message("Here's the original error message:") message(cond) return(cond) } ) return(lm_mod) }
targets运行文件代码
# 加载定义管道所需的包: library(targets) # library(tarchetypes) # 按需加载其他包 # nolint # 设置目标选项: tar_option_set( packages = c("dplyr"), # 目标运行所需的包 format = "rds" # 默认存储格式 # 按需设置其他选项 ) # tar_make_clustermq() 配置(可保持默认): options(clustermq.scheduler = "multiprocess") # tar_make_future() 配置(可保持默认): # 安装 {{future}}, {{future.callr}}, 和 {{future.batchtools}} 包以允许 use_targets() 配置 tar_make_future() 选项。 # 运行R/文件夹中的自定义函数脚本: tar_source() # source("other_functions.R") # 按需加载其他脚本 # nolint # 替换为你自己的目标列表: list( tar_target(data, get_data()), tar_target(model, fit_model(data)), tar_target(model_try, fit_model_try(data)) )
上述示例中,先运行成功的模型fit_model,再运行会抛出错误的模型fit_model_try。targets遇到错误后,并未返回tryCatch的输出,错误直接终止了管道,就连成功模型的输出也无法获取。我希望管道能运行完所有模型,同时保存成功的运行结果与失败的错误信息。
解决方案
要实现管道遇错不终止、同时保存错误信息的需求,需做两处核心调整:
- 全局设置targets的错误处理规则
在tar_option_set中添加error = "continue"参数,该参数会让targets在单个目标运行失败时,继续执行其他独立目标,而非终止整个管道。修改后的tar_option_set如下:
tar_option_set( packages = c("dplyr"), format = "rds", error = "continue" # 关键设置:遇错继续运行后续目标 )
- 确保tryCatch正确捕获并返回错误对象
你的fit_model_try函数逻辑本身可行,可优化错误对象的可读性,方便后续识别:
fit_model_try <- function(data) { lm_mod <- tryCatch( { lm(Sepal.Width ~ ERRRRRRR, data) }, error=function(cond) { # 给错误对象添加自定义属性,便于后续区分 attr(cond, "target_type") <- "model_failure" message("捕获到模型拟合错误: ", cond$message) return(cond) } ) return(lm_mod) }
- 结果验证
修改后运行tar_make(),管道会先完成data和model目标的运行并保存结果;运行model_try时会捕获错误并保存错误对象。后续可通过tar_read(model)获取成功的模型结果,用tar_read(model_try)获取捕获的错误信息。
若需更精细化控制,也可仅给特定目标设置错误规则,比如:
tar_target(model_try, fit_model_try(data), error = "continue")
内容的提问来源于stack exchange,提问作者QAsena
相关产品推荐
相关产品推荐

