3

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

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

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

好吧,自然地,简单的答案是放弃管道范式并采用传统方法:

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

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

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

4

1 回答 1

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
  }
}))
于 2016-02-02T14:05:10.213 回答