嵌套函数的R范围规则

我试图使用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)被忽略?

最佳答案 foo是在全球环境中定义的.在第一次调用eye_foo时,在创建foo的环境中找不到ii的值.然后你找到了一个值,得到了预期的结果.就那么简单.

> environment(foo)
<environment: R_GlobalEnv>

 ?'function'
 ?globalenv

通常人们通过将参数传递给函数来避免这个难题.

点赞