函数参数中的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
,则定义中的fun0x=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