关于函数参数求值的最重要的一点是,提供的参数和默认参数的处理方式不同。在函数的评估框架中计算提供的函数参数。函数的默认参数在函数的求值框架中计算。
我不太明白调用函数是什么意思。它是被调用的函数(比如在具有命名的函数的交互式sesion中为您指定了类型名称并按Enter键)。如果是,callinig函数的评估框架与函数的评估框架有何不同?
答案 0 :(得分:5)
首先更改为标准术语。函数定义中使用的参数是形式参数,调用它时传递给函数的参数是实际参数。 (问题中的quoted passage是指使用非标准术语,提供的参数时的实际参数。)
通过示例考虑两种情况。
<案例1 f
下方有正式参数x
,并且在最后一行代码中调用f
时,没有实际参数。
现在,在最后一行代码f
中调用x
时,获取值为2,因为x
在使用之前和使用时a
未设置a <- 1
f <- function(x = a) {
a <- 2
x
}
f()
## [1] 2
在函数中查找它的值为2, not 在调用者中它的值为1.
x
<案例2
另一方面,在调用者中评估实际参数。在下面的代码的最后一行中,b
设置为1,因为这是调用者中x
的值。同样,b
在使用之前不会被评估,但现在即使x
在函数本身中已设置为2,这对x
也没有影响。 b <- 1
g <- function(x) { b <- 2; x + b }
g(b)
## [1] 3
设置为1,而不是2.
x
虽然这涵盖了引用说明中的两种情况,但存在另一种情况,即在函数中引用a
但在函数中未定义时发生的情况。在下面的代码中g
是a
中的自由变量,因为g
不是参数,或者在gg
中定义。在这种情况下,当g
(等于a
)被调用时,R会尝试在函数g
中查找a
并失败,但它看起来的下一个地方是不是调用者(其中function
是1),而是函数定义的环境,即单词a
出现的环境{{1在那个环境中是2。
a <- 1
f <- function() {
a <- 2
g <- function() a
}
gg <- f()
gg()
## [1] 2
这被称为词汇范围,因为只需查看函数定义就可以知道自由变量的查找位置。