save(),意外行为

西尼亚斯

我正在尝试通过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

尽管事实上“默认”ba+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] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章