捕获对象"安全状态"在管道链

时间:2016-02-02 13:28:49

标签: r pipeline magrittr

我正在进行一些涉及大量试验和错误的科学实验。我基本上做的是沿着一系列数值方法传递一些对象,每个阶段都有一堆参数,如下所示:

x <- define_object(param1, param2) %>%
     run_method(param3, param4) %>%
     process_results(param5) %>%
     save_plot(param6)

当一切顺利时,我很高兴。但是,每个阶段都可能失败(例如,我修改了源并留下了语法错误,或者该方法与我提供的参数集不兼容),因此整个链都会停止,并且无论成功的步骤如何,对象都会丢失。在这种情况下,我希望将对象保留在其中。最新的有效状态(我称之为&#34;安全状态&#34;)。我需要这个,因为每个阶段都需要相当长的时间来执行。

嗯,当然,平凡的答案就是放弃管道范式并采用传统方法:

x <- define_object(param1, param2)
x <- run_method(x, param3, param4)
x <- process_results(x, param5)
x <- save_plot(x, param6)

所以我可以在修复后立即恢复链条。

但也许有选择仍然有管道并保持安全状态?我不是管道的头号粉丝,但我为这项任务所要求的流程要求它,虽然我描述的不便是一个交易破坏者。

1 个答案:

答案 0 :(得分:2)

假设你想捕捉出错的地方,存储它并继续计算,tryCatch将是一种自然的处理方法。

在下面的块中,我正在捕获错误并输出状态。显然,您可以实现相同的逻辑,将参数存储在“当前有效状态”。

invisible(mapply(x = 1:10, y = rnorm(10), FUN = function(x, y) {
  out <- tryCatch(
    if (x == 3) {
    simpleError("o ow, something went wrong")
  } else {
    x * y
  })

  if (any(class(out) %in% "simpleError")) {
    message(sprintf("Something went wrong for x: %s, y: %s", x, y))
  } else {
  out
  }
}))