在函数调用期间替换并恢复`globalenv()`中的对象

时间:2013-07-16 03:44:50

标签: r

我需要调用一个名为g的函数,其行为几次取决于globalenv()下的变量。为方便起见,我尝试将其包装成一个名为f的辅助函数。但是,我希望在执行f后,globalenv()是不变的。

到目前为止,这是我的实现:

g <- function(name) {
  print(globalenv()[[name]])
}

f <- function(w) {
  # backup "w" in globalenv if needed
  is_existed.w <- !is.null(globalenv()[["w"]])
  if (is_existed.w) {
    temp.w <- globalenv()[["w"]]
  }
  w <<- w
  g("w")
  # restore w if needed
  if (is_existed.w) {
    w <<- temp.w
  }
}

w <- "a"
f("gg")
w

然而,这种方法非常繁琐。我需要多次复制粘贴。有更优雅的方式来实现这个吗?

1 个答案:

答案 0 :(得分:2)

为什么需要复制和粘贴?如果是因为你想要保存不同的变量,或者调用不同的函数,你可以将它们作为参数传递给更高阶函数,即返回函数的函数,如下所示:

wrap <- function(name, g) {
  f <- function(value, ...) {
    old <- globalenv()[[name]]
    assign(name, value, globalenv())
    res <- g(...)
    if (!is.null(old))
      assign(name, old, globalenv())
    return (res)
  }
  return (f)
}

然后,您可以使用f创建wrap("w", g)并使用f("gg", "w")进行调用,后者"w"是您要打印的变量的名称。