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

在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的输出,错误直接终止了管道,就连成功模型的输出也无法获取。我希望管道能运行完所有模型,同时保存成功的运行结果与失败的错误信息。

解决方案

要实现管道遇错不终止、同时保存错误信息的需求,需做两处核心调整:

  1. 全局设置targets的错误处理规则
    在tar_option_set中添加error = "continue"参数,该参数会让targets在单个目标运行失败时,继续执行其他独立目标,而非终止整个管道。修改后的tar_option_set如下:
tar_option_set(
  packages = c("dplyr"),
  format = "rds",
  error = "continue" # 关键设置:遇错继续运行后续目标
)
  1. 确保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)
}
  1. 结果验证
    修改后运行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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.29 12:40:11