我最近了解到 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
它的环境(以及当时!)而不是调用它的环境来评估?这个词法范围如何?谢谢!
我最近了解到 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
它的环境(以及当时!)而不是调用它的环境来评估?这个词法范围如何?谢谢!
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)
上面的这个例子来自这里并给出了很好的讨论。要点是,f()
withing()
忽略了a
和b
in的定义g()
。
在面向对象编程中,动态分派在运行时选择对象方法,但实际名称绑定是在编译时完成还是在运行时完成取决于语言。