在R programing for those coming from other languages约翰库克说
R使用词法作用域,而S-PLUS使用静态作用域。差异可能很微妙,特别是在使用闭包时。
我发现这很奇怪,因为我一直认为词法范围和静态范围是同义词。
词汇和静态范围是否有明显的属性,或者这是一种区别,从社区到社区,人与人之间的区别?如果是这样,那么一般的阵营是什么?我如何区分它们以便我们在使用这些词时更能理解某些人的意思。
答案 0 :(得分:10)
Wikipedia(和我)同意你的观点“词汇范围”和“静态范围”是同义词。 This Lua discussion试图区分,但指出人们不同意这种区别。 : - )
在我看来,尝试的区别与访问不同的函数激活记录(“堆栈块”,如果你愿意)中的名称有关,而不是最当前执行记录,主要是(仅?)发生在嵌套函数中:
function f:
var x
function h:
var y
use(y) -- obviously, accesses y in current activation of h
use(x) -- the question is, which x does this access?
对于词汇范围,答案是“f
激活h
”并且动态范围意味着“最近激活的任何变量名为{{1} }“(可能不是x
)。另一方面,如果语言完全禁止使用f
,那么毫无疑问“哪个x
是这个”,因为答案是“错误”。 :-)看起来有些人使用“静态范围”来引用第三种情况。
答案 1 :(得分:4)
R官方文档还解决了R和S-plus之间的范围差异: http://cran.r-project.org/doc/manuals/R-intro.html#Scope
链接中给出的示例可以简化为:
cube <- function(n) {
sq <- function() n*n
n*sq()
}
S-Plus和R的结果不同:
## first evaluation in S
S> cube(2)
Error in sq(): Object "n" not found
Dumped
S> n <- 3
S> cube(2)
[1] 18
## then the same function evaluated in R
R> cube(2)
[1] 8
我个人认为在R中处理变量的方式更自然。