在管道链中捕获对象的 "safe state"
Capturing object's "safe state" within pipe chain
我正在 运行 进行一些科学实验,其中涉及大量的反复试验。我基本上做的是沿着一系列数值方法传递一些对象,每个阶段都有一堆参数,如下所示:
x <- define_object(param1, param2) %>%
run_method(param3, param4) %>%
process_results(param5) %>%
save_plot(param6)
当一切顺利时,我很高兴。但是,每个阶段都可能失败(例如,我修改了源代码并留下了语法错误,或者该方法与我提供的参数集不兼容),因此无论步骤成功与否,整个链都会停止并且对象会丢失。在这种情况下,我希望将对象保持在其最新的有效状态(我称之为 "safe state")。我需要它,因为每个阶段都需要相当长的时间来执行。
当然,简单的答案是放弃管道范式并采用传统方法:
x <- define_object(param1, param2)
x <- run_method(x, param3, param4)
x <- process_results(x, param5)
x <- save_plot(x, param6)
所以我可以在修复后立即恢复链。
但也许可以选择保留管道并保持安全状态?我不是管道的头号粉丝,但我为这项任务所拥有的流程要求它,尽管我描述的不便是一个交易破坏者。
假设您想捕捉任何出错的地方,存储它并继续计算,tryCatch
将是处理此问题的自然方式。
在接下来的代码块中,我发现了一个错误并输出了状态。显然,您可以实现相同的逻辑来将参数存储在某处,如 "current valid state".
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
}
}))
我正在 运行 进行一些科学实验,其中涉及大量的反复试验。我基本上做的是沿着一系列数值方法传递一些对象,每个阶段都有一堆参数,如下所示:
x <- define_object(param1, param2) %>%
run_method(param3, param4) %>%
process_results(param5) %>%
save_plot(param6)
当一切顺利时,我很高兴。但是,每个阶段都可能失败(例如,我修改了源代码并留下了语法错误,或者该方法与我提供的参数集不兼容),因此无论步骤成功与否,整个链都会停止并且对象会丢失。在这种情况下,我希望将对象保持在其最新的有效状态(我称之为 "safe state")。我需要它,因为每个阶段都需要相当长的时间来执行。
当然,简单的答案是放弃管道范式并采用传统方法:
x <- define_object(param1, param2)
x <- run_method(x, param3, param4)
x <- process_results(x, param5)
x <- save_plot(x, param6)
所以我可以在修复后立即恢复链。
但也许可以选择保留管道并保持安全状态?我不是管道的头号粉丝,但我为这项任务所拥有的流程要求它,尽管我描述的不便是一个交易破坏者。
假设您想捕捉任何出错的地方,存储它并继续计算,tryCatch
将是处理此问题的自然方式。
在接下来的代码块中,我发现了一个错误并输出了状态。显然,您可以实现相同的逻辑来将参数存储在某处,如 "current valid state".
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
}
}))