为什么R不会在通话开始时检查缺少的参数?

时间:2017-09-25 05:42:01

标签: r

我注意到R函数仅在函数体中计算特定参数时检查缺少的参数。

示例:

f <- function(x, y) {
    Sys.sleep(3)
    return(x + y)
}
f(1)

该函数需要3秒才能失败,并在函数调用开始时报告缺少的参数。这种实施的优势是什么?

编辑:

我知道force()和missing()。我想知道在评估之前的一个参数上缺少()的优点是什么,而不是在函数调用的开始。这样的实施是否有必要的原因?

作为一个人为的例子

f2 <- function() {
    Sys.sleep(3)
}

f <- function(x, y) {
    if (missing(y)) stop("y missing")
    print(x)
}

f(1, f2())

昂贵的&#34;懒惰评估仍然可以避免调用f2(),但可以在不进行评估的情况下检查其缺失。

EDIT2:

我想你可以说它在另一个人为的例子中为生成默认值提供了更大的灵活性

f <- function(x, y = 1:3) {
    if (missing(x)) {
        x <- y
    }
    x
}

f()
如果在函数调用后立即进行参数检查,则此类代码将失败。但是,此代码更好地写为function(x = y, y = 1:3)。虽然我猜这个功能会被一些非常微不足道的代码库使用,现在改变行为会比它的价值更麻烦。

1 个答案:

答案 0 :(得分:3)

  

R使用延迟评估。也就是说,直到函数的参数才被评估   他们是必需的。如果事实证明,这可以节省时间和内存   参数不是必需的。   在极少数情况下,应评估某些内容。   您可以使用force来解决懒惰问题。

烧伤,帕特里克。 2011.«The R Inferno»。 http://www.burns-stat.com/pages/Tutor/R_inferno.pdf

因此,以下代码将更快失败:

f <- function(x, y) {
 force(y)
 Sys.sleep(3)
 return(x + y)
}
f(1)

f <- function(x, y) {
  if(missing(y)) stop("missing y")
  Sys.sleep(3)
  return(x + y)
}
f(1)