函数参数中的R-椭圆(`…`)和`NULL`

函数参数中的R-椭圆(`…`)和`NULL`,r,function,parameter-passing,ellipse,R,Function,Parameter Passing,Ellipse,设想 examplefn <- function(x = NULL, ...){str(x)} 如果使用显式x=NULL,则行为也与预期一样: > examplefn(x = NULL,2) NULL 但是,当尝试(并期望从函数定义中使用x=NULL时,我得到: > examplefn(2) num 2 这意味着调用是按参数顺序计算的,忽略x=NULL定义 如何防止后者?只有在未提供x值的情况下才使用定义x=NULL。因此,在编写examplefn(2)时,R读取的是ex

设想

examplefn <- function(x = NULL, ...){str(x)}
如果使用显式
x=NULL
,则行为也与预期一样:

> examplefn(x = NULL,2)
NULL
但是,当尝试(并期望从函数定义中使用
x=NULL
时,我得到:

> examplefn(2)
num 2
这意味着调用是按参数顺序计算的,忽略
x=NULL
定义


如何防止后者?

只有在未提供
x
值的情况下才使用定义
x=NULL
。因此,在编写
examplefn(2)
时,
R
读取的是
examplefn(x=2)
(因为
x
是参数编号1),因此是结果

如果您想避免这种情况,以下是几种方法:

1.通过创建两个函数

fun0 <- function (x, ...) str(x) 
fun1 <- function (...) fun0(NULL, ...)
fun1(2)
# NULL

如果缺少
x
,则定义中的
fun0
x=NULL
是默认值。在
examplefn(2)
中,您基本上设置了
x=2
。您希望
x
始终为
NULL
并且
examplefn(2)
等于
examplefn(NULL,2)
?是的,这就是目标。我显然不理解评估,但我希望未命名的
2
继续表示椭圆……阅读语言定义的这一部分可能会让您受益(我甚至建议您阅读整个文档):3.确实是最方便的。谢谢。但是,在我的实际应用程序中,我失去了管道(
magrittr
)x参数的选项(它是一个
列表
)-如果它是
NULL
,它将被创建,如果给定则被修改。。。
fun0 <- function (x, ...) str(x) 
fun1 <- function (...) fun0(NULL, ...)
fun1(2)
# NULL
fun2 <- function (x = NULL, y) str(x)
fun2(y = 2) 
# NULL
fun3 <- function (..., x = NULL) str(x)
fun3(2)  
# NULL
fun4 <- function (...) {
  x <- NULL
  str(x)
}
fun4(2)    
# NULL