1

我最近了解到 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它的环境(以及当时!)而不是调用它的环境来评估?这个词法范围如何?谢谢!

4

1 回答 1

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)

上面的这个例子来自这里并给出了很好的讨论。要点是,f()withing()忽略了abin的定义g()


来自“范围”的 wiki

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

于 2013-12-13T17:53:43.867 回答