R中的parent.frame()和parent.env()有什么不同? 他们如何在参考呼叫方面有所不同?

如果有人可以用一个简单的例子来说明这一点会有帮助吗?

另外,使用parent.frame()而不是parent.env() ,反之亦然。

parent.env是定义闭包(例如,函数)的环境。 parent.frame是从中调用闭包的环境。

 f = function() c(f=environment(), defined_in=parent.env(environment()), called_from=parent.frame()) g = function() c(g=environment(), f()) 

接着

 > g() $g <environment: 0x14060e8> $f <environment: 0x1405f28> $defined_in <environment: R_GlobalEnv> $called_from <environment: 0x14060e8> 

我不确定何时一个凡人真的想要使用它们,但这些概念对理解词汇范围是有用的

 > f = function() x > g = function() { x = 2; f() } > h = function() { x = 3; function() x } > x = 1 > f() [1] 1 > g() [1] 1 > h()() [1] 3 

或者在介绍R中神秘的“银行账户”例子中?parent.frame的Details部分的?parent.frame可能会澄清一些事情。

环境在R中是普遍的,例如, search()path是(近似)环境链接在一起的兄弟关系。 一个人有时会看到env = new.env(parent=emptyenv())来规避符号查找 – 通常env[["x"]]将首先在env查找,然后在env的父级中查找。 同样, <<-parent.env查找分配。 R中相对较新的参考类实现依赖于这些思想来定义一个实例特定的环境,其中可以find符号(实例字段和方法)。