我注意到R函数仅在函数体中计算特定参数时检查缺少的参数。为什么R在通话开始时不检查缺失的参数?
例子:
f <- function(x, y) {
Sys.sleep(3)
return(x + y)
}
f(1)
功能需要3秒的失败,并且在函数调用的开始报告,而这名失踪的说法。这种实现的优点是什么?
编辑:
我所知道的力()和失踪()。我想知道在评估之前立即丢失()参数的好处,而不是在函数调用的开始处。这样的实施有没有必要的理由?
作为一个人为的例子
f2 <- function() {
Sys.sleep(3)
}
f <- function(x, y) {
if (missing(y)) stop("y missing")
print(x)
}
f(1, f2())
的“昂贵”呼叫到f2()仍然由惰性求避免,但其missingness可以在不评价进行检查。
EDIT2:
我想你可以争辩说,它给出了生成的默认值更大的灵活性,另一人为的例子,如果参数检查是在函数调用立即进行
f <- function(x, y = 1:3) {
if (missing(x)) {
x <- y
}
x
}
f()
这样的代码会失败。不过,这段代码最好写成function(x = y, y = 1:3)
。虽然我猜这样的功能会被一些不重要的代码库所使用,现在改变行为会比它的价值更麻烦。
R是照本宣科,而不是编译语言。许多其他事物也只在运行时才会失败,例如类型安全问题。当我[运行你的示例脚本](http://rextester.com/QWSQVQ35038)我肯定会回来错误反馈告诉我发生了什么。 –
抱歉,我会编辑问题以清楚说明。我指出的事实是,它不会失败,直到变量y实际上在函数的主体中被计算,我没有看到任何理由为什么在函数调用开始时没有检查参数的缺失。 – shians
懒惰评估是一项功能。它使得许多呼叫更快。 – Roland