我正在进行一些涉及大量试验和错误的科学实验。我基本上做的是沿着一系列数值方法传递一些对象,每个阶段都有一堆参数,如下所示:
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)
所以我可以在修复后立即恢复链条。
但也许有选择仍然有管道并保持安全状态?我不是管道的头号粉丝,但我为这项任务所要求的流程要求它,虽然我描述的不便是一个交易破坏者。
答案 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
}
}))