R:关于环境的困惑

R:关于环境的困惑,r,environment,R,Environment,我是个新手,正在努力澄清一些关于环境的困惑。我的问题密切相关,所以我将在这里全部提问 问题1:“父”环境(也称为“机柜”,通过parent.env访问)与“父框架”(通过parent.frame访问)(n=1)之间有什么区别?例如: f = function() { print(environment()); g = function() {env = environment(); print(env); print(parent.env(env)); print(parent.fram

我是个新手,正在努力澄清一些关于环境的困惑。我的问题密切相关,所以我将在这里全部提问

问题1:“父”环境(也称为“机柜”,通过parent.env访问)与“父框架”(通过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 <- function() x
environment(f) <- as.environment("Env1")
f()
## [1] "Env2_value_x"
调用f将为g的本地环境(即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吗?这当然是一件坏事,但是,这么说有什么意义呢?GlobalEnv是Env1的外壳,而Env1实际上是在向Env2传递问题

问题3:考虑

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;                        
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,因为x在Env1中未定义。但它不应该返回“Env2_value_x”,因为Env2是搜索路径中的下一行,而x实际上是在那里定义的

最后

问题4:在Rstudio、搜索路径和全部中是否有完全重置R的方法?rm(list=ls())当然会清除变量,您可以多次键入detach()来清除搜索路径,但这很烦人。R中是否有常规重启命令

谢谢大家的帮助。

1)如果
g
是在全局环境中定义的,而不是在
f
中定义的,那么
g
的父框架将是全局环境,但是当从
f
调用
g
时,则
env
将是其父框架

2)将对象附加到搜索路径并不实际附加它。而是创建一个新环境并将对象复制到其中。问题中定义的Env1和Env2环境与搜索路径上同名的环境不同。将
a
添加到Env1不会将
a
添加到搜索路径上的副本

Env1$a <- 99
ls(as.environment("Env1"))
## [1] "x" "y"
一般来说,最好不要使用
attach
。就我个人而言,我不使用它

3)您可以定义一个环境为
Env1
的函数。在这种情况下,它将从搜索路径上的该点开始搜索自由变量。继续你的例子:

f = function() { print(environment());
    g = function() {env = environment(); print(env); print(parent.env(env)); print(parent.frame(n=1));}
g();
}

f();
f <- function() x
environment(f) <- as.environment("Env1")
f()
## [1] "Env2_value_x"

f问题不应与(4)中的其他问题无关。