我需要调用一个名为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
然而,这种方法非常繁琐。我需要多次复制粘贴。有更优雅的方式来实现这个吗?
答案 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"
是您要打印的变量的名称。