我最近了解到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
,而不是调用的地方?这个词汇范围怎么样?谢谢!
答案 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()
会忽略a
中b
和g()
的定义。
在面向对象的编程中,动态调度在运行时选择一个对象方法,但实际的名称绑定是在编译时还是在运行时完成取决于语言。