4.3.4 作用域

Keywords:

Previous: Argument evaluation,Up: Evaluation

4.3.4 作用域

作用域或作用域规则简单说就是求值程序为一个符号寻找值所用规则的集合。每种计算机语言都有这样的一套规则。在 R里面,这个规则非常的简单,但也确实存在一些机制搅乱常见的或默认的规则。

R 沿用一套称之为词法作用域的规则。这表明在表达式创建时变量的有效绑定可用来为表达式中的自由符号提供值。

作用域的许多有趣的性质都和函数的求值有关,现在我们集中描述这个问题。一个符号要么是有约束的要么是自由的。一个函数的所有形式参数在函数主体中提供了被约束的符号。任何其它在函数主体里面的符号要么是局部变量要么是自由变量。局部变量是在函数中定义的变量。因为 R 没有变量的形式定义,它们只在需要的时候才使用,这样就很难区分一个变量是否是局部变量。局部变量首先需要定义,典型的做法是让它们处在一个赋值操作的左边。在求值过程中,如果发现一个自由变量,那么 R 会去给它找一个值。作用域规则决定了这个过程如何进行。在 R 里面,函数的环境首先会被搜索,然后是它的外围,如此直到全局环境。

全局环境指向一个为某个匹配符号逐步搜索的环境的搜索列表。第一个匹配上的值会被采用。

当这些规则结合函数能以值的形式从其它函数返回的事实,感觉确实不错。但是首先,你必须获得所有特性。1

一个简单的例子是,

     f <- function(x) {

         y <- 10

         g <- function(x) x + y

         return(g)

     }

     h <- f()

     h(3)

一个非常有意思的问题是,当h被求值,什么会发生呢?为了描述这个,我们需要一些的新的考虑。在函数主体里面,变量可以是被约束的,局部的或者自由的。被约束的变量是这些匹配函数形式参数的变量。局部变量指的是那些在函数主体内创建和定义的变量。自由变量指的是那些既不是局部也不是被约束的变量。当一个函数主体被求值,确定一个局部或被约束变量的值没有问题。作用域规则决定了一个语言如何为自由变量找恰当的值。

h(3) 被求值,我们发现它的主体就是 g 的主体。在那个主体中,xy 都是自由的。在一个词法作用域定义的语言中,x 的值和 3 关联而 y 和 10 关联,因此 h() 返回值 13。在R里面,事实上就是这样发生的。

在 S里面,因为不同的作用域规则,上面的例子可能会报错并且提示y找不到。此时除非在你的工作空间中有一个变量y,那么这个值将会被使用。


Footnotes

[1] 译者注:原文为“When this set of rules is combined with the fact thatfunctions can bereturned as values from other functions then some rather nice, but atfirst glance peculiar, properties obtain.”

Hits:Loading...

special topic