R 中的函数参数评估

Function Argument Evaluation in R

过去几周我一直在阅读 Hadley Wickham 的 Advanced R,一个特别的概念引起了我的注意,如果你能给我解释一下,我将不胜感激:

The evaluation environment is slightly different for default and user supplied arguments, as default arguments are evaluated inside the function.

本书给出了以下示例:

h05 <- function(x = ls()) {
a <- 1
x
}
# ls() evaluated inside h05:
h05()
#> [1] "a" "x"
# ls() evaluated in global environment:
h05(ls())
#> [1] "h05"

这里很明显,当用户提供 ls() 作为参数 x 的值时,它是在全局环境中评估的。然而,在下面的示例中,当我们为 xy 提供 2 个值时,它不会影响它们在全局环境中的值,尽管它们正在那里被评估:

y <- 6
x <- 5

f1 <- function(x, y) {
  x*2 + y
}

f1(x = 4, y = 12)

我想知道我在这里遗漏了什么以及上述规则是否仅在我们根据函数调用中的其他参数定义和参数时才适用。

非常感谢任何解释。

经过评论中的讨论,这里给出一个答案:

线条

y <- 6
x <- 5

创建两个全局变量。

函数定义

f1 <- function(x, y) {
  x*2 + y
}

创建一个名为 f1 的函数,它有两个名为 xy 的参数。当你调用它时,它会创建变量 xy,它们在评估 f1 的主体时可见。这些被称为局部变量。它们通常会在功能结束时消失。这些变量的值将是传入的表达式的值。

当你称它为

f1(x = 4, y = 12)

它计算全局环境中的表达式 412 以找到局部变量的值。全局变量 xy 与此无关。

如果你像这样打电话

f1(x = 4, y = y <- x)

它将像以前一样计算 4,但是当它计算 y <- x 时,它将使用全局变量:因此将全局值 y 更改为 5 .它还将局部变量 y 设置为 5,因为赋值 return 正在分配的值。

编辑添加:上面的讨论忽略了“惰性评估”,所以事情不会按照描述的顺序发生。事实上,只有在表达式 x*2 + y 中使用局部变量后,才会对参数求值。这对该函数没有影响,但在更复杂的情况下,求值顺序有时会有所不同。