R的词汇范围

时间:2013-12-13 17:40:04

标签: r lexical-scope

我最近了解到R有词汇和动态范围可用,但它默认使用词法范围。下一个案子让我很困惑:

> x <- 1
> f <- function(y) { x + y }
> f(5)  # we expect 6    
[1] 6
> x <- 10
> f(5)  # shouldn't we again expect 6?
[1] 15

不应该使用定义的环境来评估f,而不是调用的地方?这个词汇范围怎么样?谢谢!

1 个答案:

答案 0 :(得分:2)

f <- function(y) { x + y }

是在全局环境中定义的,因此对于函数本身未定义的部分(即x),R会查看它们的全局环境。

a=1
b=2
f<-function(x)
{
  a*x + b
}
g<-function(x)
{
  a=2
  b=1
  f(x)
}
# compare f(2) and g(2)

上面的例子来自here,并提供了很好的讨论。重点是,f()中的g()会忽略abg()的定义。


来自wiki on "Scope"

  

在面向对象的编程中,动态调度在运行时选择一个对象方法,但实际的名称绑定是在编译时还是在运行时完成取决于语言。