了解R的范围演示

时间:2016-09-01 10:08:43

标签: r scoping

我尝试了解R中您可以通过demo(scoping)访问的范围演示。

我不明白保存total变量的位置。首先,根据help("<<-")

,我想
  

运营商&lt;&lt; - & - &gt;&gt;通常只用于函数,和   导致搜索通过父环境进行搜索   被分配的变量的定义。如果找到这样的变量   (并且它的绑定没有被锁定)然后重新定义它的值,否则   任务发生在全球环境中。

它位于global environment。但由于我在(ls(environment))找不到它,我猜open.account <- function(total)为由open.account()赋值创建的所有实例创建一个总变量。但是,如果我创建一个实例ross <- open.account(100),我找不到变量。

ross
...
<environment: 0x0000000011fbe998>

ls(environment(environment: 0x0000000011fbe998))getAnywhere(total)的结果是no object named ‘total’ was found。那么在哪里生活total的不同版本?

1 个答案:

答案 0 :(得分:5)

ross列表中的函数是闭包,即functions with data。 (从技术上讲,R中的大多数函数都是闭包。但通常你不关心它。)

所有这些闭包都是在对open.account的调用中定义的,因此它们与相同的环境相关联,“在使用闭包时提供评估框的外壳”(参见help("closure"))。

total在此环境中定义。

ross <- open.account(100)

environment(ross$deposit)
#<environment: 0x000000000ae10db8>
environment(ross$withdraw)
#<environment: 0x000000000ae10db8>
environment(ross$balance)
#<environment: 0x000000000ae10db8>

environment(ross$deposit)$total
#[1] 100