何时使用missing和NULL值在R中传递未定义的函数参数,为什么?

joe*_*ley 8 null r function parameter-passing

到目前为止,在编写R函数时,我将未定义的参数作为NULL值传递,然后测试它们是否为NULL即

f1 <- function (x = NULL) {
   if(is.null(x))
      ...
}
Run Code Online (Sandbox Code Playgroud)

但是我最近发现了将未定义的参数传递为缺失的可能性

f2 <- function (x) {
   if(missing(x))
      ...
}
Run Code Online (Sandbox Code Playgroud)

R文件说明了这一点

当前缺失只能在定义参数的函数的直接主体中使用,而不能在嵌套函数或本地调用的主体中使用.这可能在将来发生变化.

显然,这是使用缺失来确定未定义值的一个缺点是否有其他人或意识到?或者以更有用的形式表达问题"你何时使用缺失与NULL值来传递R中未定义的函数参数?为什么?"

edd*_*ddi 8

NULL只是您可以分配给变量的另一个值.它与您在函数声明中指定的任何其他默认值没有什么不同.

missing另一方面检查用户是否提供了该参数,您可以默认分配之前执行该操作 - 这要归功于R的惰性评估仅在使用该变量时发生.

您可以通过以下方式实现的几个示例是:没有默认值的参数,您仍然可以省略 - 例如filetextin read.table,或者使用默认值的参数,您只能指定一个 - 例如nnmaxin scan.

您可以通过浏览R代码找到许多其他用例.


gag*_*ews 5

missing(x)似乎比使用默认arg x等于快一点NULL.

> require('microbenchmark')
> f1 <- function(x=NULL) is.null(x)
> f2 <- function(x) missing(x)

> microbenchmark(f1(1), f2(1))
Unit: nanoseconds
  expr min  lq median    uq  max neval
 f1(1) 615 631  647.5 800.5 3024   100
 f2(1) 497 511  567.0 755.5 7916   100

> microbenchmark(f1(), f2())
Unit: nanoseconds
 expr min  lq median    uq  max neval
 f1() 589 619    627 745.5 3561   100
 f2() 437 448    463 479.0 2869   100
Run Code Online (Sandbox Code Playgroud)

请注意,如果您拨打电话,仍然会报告该f1案例x丢失f1(),但它的值可以在其中读取f1.

第二种情况比第一种情况更为普遍.missing()只是意味着用户没有传递任何值.is.null()(使用NULL默认arg)声明用户要么没有传递任何内容,要么他/她通过了NULL.

顺便说一句,plot.default()chisq.test()NULL他们的第二个参数.在另一方面,getS3method('t.test', 'default')使用NULLy参数,并missing()mu(为了对许多使用场景来制备).

我认为一些R用户更喜欢f1类型的功能,特别是在与*apply家人一起工作时:

sapply(list(1, NULL, 2, NULL), f1)
Run Code Online (Sandbox Code Playgroud)

在这种f2情况下实现这一目标并非如此简单.

  • 我没有意识到在`f1`情况下,如果你调用`f1()`,`x`仍然被报告为缺失.看起来通常设置默认值是最有用的 - 它也使用户明确表示他们不必提供值. (2认同)