R 中的形式参数评估和词法范围

Formal Arguments Evaluation and Lexical Scoping in R

我一直在阅读 Hadley Wickham 的 Advanced R,以便更好地了解机制或 R 及其背后的工作原理。到目前为止我很享受并且一切都很清楚,有一个问题占据了我的脑海,我还没有找到解释。 我非常熟悉 R 的范围规则,它决定了如何将值分配给自由变量,但是我一直在努力解决为什么 R 在第一种情况下无法通过词法范围找到形式参数的值的想法?考虑以下示例:

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

f1(x = 3)

我通常会抛出错误,因为我没有为参数 y 分配默认值,但是如果我在函数体中创建局部变量 y,它就不会抛出任何错误:

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

f1(x = 3)

非常感谢您

您已经在 f1() 中定义了 y,只是您还没有为它绑定一个值。全局环境中的y是一个完全不同的变量。

您为函数指定了参数 y,但在 return 中要求提供值时未提供任何值。所以这会起作用

f1(x = 3, y)
[1] 10

这里它将 y 您定义的变量作为第二个参数的输入,顺便说一句,它也被命名为 y 并且 returns 是一个值。

即使这样也行。因为你已经为这个函数定义了一个默认值

y1 <- 4
f1 <- function(x = 2, y= y1) {
  x*2 + y
}
f1(x=3)
#> [1] 10
f1(x = 3, 5)
#> [1] 11

reprex package (v2.0.0)

于 2021-05-03 创建

如果您想在不为任何参数提供任何值的情况下评估任何函数,则必须在函数本身中定义它。