gpt4 book ai didi

r - 参数默认值的意外行为

转载 作者:行者123 更新时间:2023-12-04 12:49:12 25 4
gpt4 key购买 nike

我刚刚遇到了一些奇怪的事情,希望这里的人可以解释一下。基本上,当一个函数有一个参数的默认值是参数的名称时,奇怪的事情就会发生(好吧,反正对我来说很奇怪)。

例如:

y <- 5

f <- function(x=y) x^2

f2 <- function(y=y) y^2

我会考虑 ff2是等价的;尽管它们在内部使用不同的变量名,但它们都应该选择 y对象在全局环境中用作默认值。然而:
> f()
[1] 25

> f2()
Error in y^2 : 'y' is missing

不知道为什么会这样。

只是为了让事情变得更有趣:
f3 <- function(y=y) y$foo

> f3()
Error in f3() :
promise already under evaluation: recursive default argument reference or earlier problems?

我预计 f3 会抛出错误,但不是那个错误!

这是在 32 位 Windows XP SP3 上的 R 2.11.1、2.12.2 和 2.14 上测试的。仅加载标准包。

最佳答案

默认参数在函数范围内进行评估。您的 f2类似于(几乎等价)以下代码:

f2 = function(y) {
if (missing(y)) y = y
y^2
}

这使范围更清晰,并解释了为什么您的代码不起作用。

请注意,这仅适用于默认参数;显式传递的参数(当然)在调用者的范围内进行评估。

另一方面,惰性求值与此无关:所有参数都被惰性求值,但调用 f2(y)毫无怨言地工作。为了表明惰性求值总是发生,请考虑:
f3 = function (x) {
message("x has not been evaluated yet")
x
}

f3(message("NOW x has been evaluated")

这将按以下顺序打印:
x has not been evaluated yet
NOW x has been evaluated

关于r - 参数默认值的意外行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8425348/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com