嵌套函数的R范围规则

时间:2013-11-09 00:22:38

标签: r scope

我正在尝试使用R的词法范围与2级函数,但R 3.0.2中的行为似乎不正确。

foo = function() print(ii)
eye_foo = function( ) { 
    ii = 1  # (A)
    foo()
}
eye_foo()   # (B)
ii=2        # (C)
eye_foo()   # (D)

我希望(B)打印“1”,绑定到(A)中定义的变量。而是(B)给出错误消息“打印错误(ii):对象'ii'未找到”。但是,在全局范围内的(C)中定义ii后,(D)在过程中打印“2”忽略(A)。

为什么(A)被忽略?

1 个答案:

答案 0 :(得分:2)

foo已在全球环境中定义。在第一次调用eye_foo时,在创建foo的环境中找不到ii的值。然后你找到了一个值,得到了预期的结果。就这么简单。

> environment(foo)
<environment: R_GlobalEnv>

 ?'function'
 ?globalenv

一般来说,人们通过将参数传递给函数来避免这个难题。