在 R 里面,函数是对象并且可以有许多和其它对象类似的操作方法。 函数(更准确地说是函数闭包(function closure))有三个基本的 组成部分:形式化的参数列表,功能实现的主体和 环境。参数列表是一个以逗号分割的参数的列表。 参数可以是符号,或者是symbol = default 的形式,或者是特殊参数 ...。第二种参数形式 常常用于设置参数的默认值。 如果函数调用时参数缺省,该值会被采用。 ...参数比较特殊,而且可以包含任意多的参数。 它通常在参数个数未知或者某些参数会传递给其它 函数的情况下使用。
功能实现的主体是解析过的 R 语句。它常常是大括弧里面的 一系列程序语句。当然,它也有可能是一个单独的语句,一个 符号,甚至是一个常量。
函数的环境 指的是当一个函数被创建时所激活的环境。 任何被该环境绑定的符号都可以被函数调用和访问。 函数代码及其对应环境中绑定的东西构成的组合体 称为`函数闭包'(function closure)。该术语源自函数化编程理论 (functional programming theory)。 在本文档中,我们主要使用术语`函数',但使用`闭包'(closure)来强调 一个函数相关环境的重要性。
可以通过 formals, body,和 environment 三个
构造(这三个构造也可用在赋值语句的左边)来析取和操作闭包的三个部分。
最后一个构造可以用来去掉不想要的环境捕获物(environment capture)。
当一个函数被调用时,一个新的环境(称为求值环境(evaluation environment)) 将会被创建。该环境的外围(enclosure,见Environment objects) 来自函数闭包的环境。 这个新的环境最初由函数的未被求值的参数构成; 当求值过程进行时,局部变量将会在该环境中创建。
可以方便地用as.list 和 as.function
将函数和列表结构相互转换。
这些方法可以用来实现和S兼容,但我们
不推崇这样使用。