R:对环境的困惑

时间:2018-02-23 04:38:46

标签: r environment

我是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中是否有一般的重启命令?

非常感谢帮助。

1 个答案:

答案 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)请参阅

Restart R within Rstudio

Quit and restart a clean R session from within R?

注意

建议退房:

http://blog.obeautifulcode.com/R/How-R-Searches-And-Finds-Stuff/