我正在尝试通过save()从函数调用中保存变量
f <- function(x) {
r <- x - g(x)
r
}
g <- function(y) {
r <- y * h(y)
r
}
h <- function(z) {
save(list = ls(all = TRUE), file = "hello.RData", envir = parent.frame())
r <- log(z)
if (r < 10)
r^2
else r^3
}
但是,即使根据文档parent.frame()是envir的标准值,这也会返回错误“找不到对象z”。
save(list = ls(all = TRUE), file = "hello.RData", envir = sys.frame())
也不起作用
save(list = ls(all = TRUE), file = "hello.RData")
这有效。但是对于我来说,如果文档中没有给出标准的环境值,实际的环境实际上是一个谜。
错误的原因是什么?为什么父框架是在save()中要查看的标准环境?
需要注意的重要一点是,在评估函数的默认值和评估传递的值之间存在差异。考虑
ff<-function(a, b=a+2) {print(b)}
ff(2);
# [1] 4
ff(2, a+2);
# Error in print(b) : object 'a' not found
尽管事实上“默认”b
是a+2
我们不能仅仅a+2
因为需要在不同的上下文中对其进行评估而通过。
这是另一个例子
gg<-function(a) {
ff(2, match.call());
}
ff<-function(a, b=match.call()) {
print(b)
}
ff(2);
# ff(a = 2)
gg(2)
# gg(a = 2);
尽管将gg
相同的“默认值”传递给ff
,但我们得到了不同的行为。
这就是发生了什么save(..., envir=parent.frame())
。当您在中调用该函数时h()
,您将从h()
被调用的位置获取框架,但是,如果您未指定环境,则在save
调用时parent.frame()
,save
将从save()
被调用的位置获取框架。如果您想将当前环境明确传递给save()
,则可以这样做
save(list = ls(all = TRUE), file = "hello.RData", envir=environment())
但这基本上与完全不指定envir=
参数的作用相同。
因此文档是正确的,只是行为取决于实际呼叫的人而有所不同parent.frame()
。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句