【问题标题】:Function Argument Evaluation in RR中的函数参数评估
【发布时间】:2021-03-14 12:44:11
【问题描述】:

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

默认和用户的评估环境略有不同 提供的参数,因为默认参数在 功能。

本书提供了以下示例:

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)

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

任何解释都非常感谢。

【问题讨论】:

  • 这与stackoverflow.com/q/66623900/2554330的答案相同:函数中的xy是与全局环境中的xy不同的变量。
  • f1(x = 4, y = 12) 中,本书所讨论的值是4 和12。xy 是函数参数名称。
  • 如果你使用了像f1(x = (x &lt;- 4), y = 12) 这样奇怪的东西,两个x 标记将代表不同的变量:第一个是成为局部变量的参数名称,第二个是表达式的一部分全局环境,因此改变全局值。
  • 是的,完全正确。
  • 是的,有点。更准确地说,它是函数头中定义的变量。它是在函数体中可见的那个。

标签: r function default-arguments


【解决方案1】:

经过cmets的讨论,下面给出答案:

线条

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 &lt;- x时,它将使用全局变量:因此将全局值y更改为5。它还将局部变量y 设置为5,因为赋值返回被赋值的值。

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

【讨论】:

  • 再次非常感谢您抽出时间回答我的问题。我真的很感激,我很高兴终于在这里发现了细微的差别。
猜你喜欢
  • 2013-08-31
  • 1970-01-01
  • 1970-01-01
  • 2016-04-20
  • 1970-01-01
  • 2015-12-01
  • 1970-01-01
  • 2023-03-11
  • 1970-01-01
相关资源
最近更新 更多