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中未定义的函数参数?为什么?"
NULL只是您可以分配给变量的另一个值.它与您在函数声明中指定的任何其他默认值没有什么不同.
missing另一方面检查用户是否提供了该参数,您可以在默认分配之前执行该操作 - 这要归功于R的惰性评估仅在使用该变量时发生.
您可以通过以下方式实现的几个示例是:没有默认值的参数,您仍然可以省略 - 例如file和textin read.table,或者使用默认值的参数,您只能指定一个 - 例如n和nmaxin scan.
您可以通过浏览R代码找到许多其他用例.
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')使用NULL为y参数,并missing()为mu(为了对许多使用场景来制备).
我认为一些R用户更喜欢f1类型的功能,特别是在与*apply家人一起工作时:
sapply(list(1, NULL, 2, NULL), f1)
Run Code Online (Sandbox Code Playgroud)
在这种f2情况下实现这一目标并非如此简单.