我是R的新手并试图澄清对环境的一些困惑。我的问题密切相关,所以我只想在这里问他们。
问题1:'parent'环境(也称为'enclosure',通过parent.env访问)和'parent frame'之间的区别是什么?通过parent.frame(n = 1)访问?例如:
f = function() { print(environment());
g = function() {env = environment(); print(env); print(parent.env(env)); print(parent.frame(n=1));}
g();
}
f();
调用f将为g的本地环境提供相同的“enclosure”和“parent frame”,即f的本地环境。那有什么区别?
问题2:根据我的理解,环境的封闭是R在环境无法应对时寻找某事物定义的下一个地方。但是,一旦您附加环境并将其放置在搜索路径中的某个位置,它似乎没有任何区别。考虑
Env1 = new.env(); Env2 = new.env();
parent.env(.GlobalEnv); parent.env(Env2); parent.env(Env1);
x = "Global_value_x";
Env1$x = "Env1_value_x"; Env1$y = "Env1_value_y";
Env2$x = "Env2_value_x"; Env2$y = "Env2_value_y"; Env2$z = "Env2_value_z";
attach(Env2); attach(Env1);
parent.env(.GlobalEnv); parent.env(Env2); parent.env(Env1);
x; y; z;
比较第2行和第7行的输出。。GlobalEnv的外壳已适当更改为Env1,因为Env1现在位于搜索路径中的第2位,但Env1的外壳仍然是.GlobalEnv。当你调用x,y和z时,Env2的z值就是返回的值,表明Env1正在将问题传递给Env2。但是,它不应该把问题传回它的圈地,即.GlobalEnv?当然,这会是一件坏事,但是,仍然有什么意义。当Env1实际上将问题传递给Env2时,GlobalEnv是Env1的圈地?
问题3:考虑
x = "Global_value_x";
Env1 = new.env(); Env2 = new.env();
Env2$x = "Env2_value_x";
attach(Env2); attach(Env1);
x;
Env1$x;
在执行第4行之后,R提醒我x已经在全局环境中定义,因此它在Env2中的值已被屏蔽。第5行当然返回x的全局值。有没有办法取代这个?换句话说,将Env1放在搜索路径中的第1位置?似乎拥有一个环境的整个观点是暂时“生活”在其中,使其成为您新的默认操作空间,其价值应优先于您已完成的其他内容。我意识到这基本上是在调用函数时发生的事情,为其变量和诸如此类的东西创建临时本地环境。有没有办法在常规工作区中的任何函数之外实现这一点?
另外,请注意执行第6行返回NULL,因为在Env1中未定义x。但是不应该返回“Env2_value_x”,因为Env2在搜索路径中排在第二位,而x实际上是在那里定义的?
最后
问题4:无论如何在Rstudio,搜索路径和所有内容中完全重置R? rm(list = ls())当然会清除变量,你可以多次输入detach()来清除搜索路径,但这很烦人。 R中是否有一般的重启命令?
非常感谢帮助。
答案 0 :(得分:0)
1)如果g
已在全局环境中定义而不是f
内,那么g
的父框架将成为全球环境,但何时从g
调用f
,然后env
将成为其父框架。
2)将对象附加到搜索路径实际上并未附加它。而是创建一个新环境并将对象复制到其中。问题中定义的Env1和Env2环境与搜索路径上的同名环境不同。将a
添加到Env1不会将a
添加到搜索路径上的副本中。
Env1$a <- 99
ls(as.environment("Env1"))
## [1] "x" "y"
搜索路径上副本的父环境与Env1
的父环境不同。
parent.env(Env1)
## <environment: R_GlobalEnv>
parent.env(as.environment("Env1"))
## <environment: 0x0000000038452ff0>
## attr(,"name")
## [1] "Env2"
一般来说,最好不要使用attach
。就个人而言,我不会使用它。
3)您可以定义一个环境为Env1
的函数。在这种情况下,它将搜索从搜索路径上的该点开始的自由变量。继续你的例子:
f <- function() x
environment(f) <- as.environment("Env1")
f()
## [1] "Env2_value_x"
4)请参阅
Quit and restart a clean R session from within R?
建议退房:
http://blog.obeautifulcode.com/R/How-R-Searches-And-Finds-Stuff/