修改on.exit表达式列表

时间:2017-07-11 15:27:44

标签: r

我认为没有,但可以取消使用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

问题

  1. 这种技术什么时候会失败?
  2. 处理这种情况是否有更健全/更有效的方法?
  3. (心愿单)有没有办法安全地挑选特定的参赛作品? (例如,通过名称,通过一些唯一的密钥)。 (其他语言提供了添加钩子的参考,可以用来取消钩子,由调用者设置或由on.exit返回。)
  4. 工作示例

    非伪代码工作示例:

    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
    

    警告:大多数情况下,等待函数结束以便触发清理表达式是完全正常的。这适用于首选/需要快速清理的那些时间(例如,长时间运行的进程)。

0 个答案:

没有答案