我认为没有,但可以取消使用on.exit
注册的来电吗?
例如,给定一个需要立即清理的任务:
myfunc <- function(...) {
prep_for_messy_stuff
on.exit(cleanup_messy_stuff(), add = TRUE)
messy_stuff
cleanup_messy_stuff()
# do other work that requires non-messiness
}
如果cleanup_messy_command()
很挑剔,那么它会在最后(第二个实例)运行时抱怨。 (假设我们不控制这个清理功能。tryCatch(capture.output(suppressMessages(cleanup_messy_stuff())), warning=function(w) FALSE, error=function(e) FALSE)
之类的黑客不需要。)
如果没有太多工作,我可以检索当前的表达式列表,删除一个(或更多),并替换on.exit
表达式列表:
myfunc <- function(...) {
on.exit(0) # to ensure list(ex) is always a list of expressions, leading with "{"
prep_for_messy_stuff
on.exit(cleanup_messy_stuff(), add = TRUE)
messy_stuff
cleanup_messy_stuff()
ex <- sys.on.exit() # if I get here, there's no need to cleanup again
do.call(on.exit, c(list(ex[ -length(ex) ]), add = FALSE))
# do other work that requires non-messiness
}
最初的on.exit
调用是length(ex)
始终是一个加上表达式的数量,也可以像list
一样对待;否则,它是第一个表达式的长度(不是1)。 (此列表中的第一个是表达式块的左括号{
。)
这种方法似乎有效,但我想知道我是否会以这种方式开始捣乱内部。如果我需要删除列表中最后一个表达式以外的任何内容,那么我认为我可以假设(n + 1) th 元素来自n 致电on.exit
。
on.exit
返回。)非伪代码工作示例:
myfunc <- function(...) {
on.exit(0) # to ensure list(ex) is always a list of expressions, leading with "{"
on.exit(message('a'), add = TRUE)
on.exit(message('b'), add = TRUE)
on.exit(message('c'), add = TRUE)
ex <- sys.on.exit()
do.call(on.exit, c(list(ex[ -length(ex) ]), add = FALSE))
# remaining stuff
99
}
myfunc()
# a
# b
# [1] 99
警告:大多数情况下,等待函数结束以便触发清理表达式是完全正常的。这适用于首选/需要快速清理的那些时间(例如,长时间运行的进程)。