R - 函数参数中的椭圆 (`...`) 和 `NULL`
R - Ellipse (`...`) and `NULL` in function parameters
设想
examplefn <- function(x = NULL, ...){str(x)}
我正在尝试让这个函数兑现隐含的 x = NULL
。考虑以下因素:
对于同时使用 x
和 ...
的调用,结果如预期:
> examplefn(1,2)
num 1
如果使用显式 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
2. 另一种方法是命名参数,例如
fun2 <- function (x = NULL, y) str(x)
fun2(y = 2)
# NULL
3. 另一种方法,也许对您来说最方便,就是简单地重新排序参数,参见
fun3 <- function (..., x = NULL) str(x)
fun3(2)
# NULL
4. 最后,这里还有一个(微不足道的)可能性——在函数内部设置x <- NULL
fun4 <- function (...) {
x <- NULL
str(x)
}
fun4(2)
# NULL
但我假设你有理由希望 x
成为一个论点。
设想
examplefn <- function(x = NULL, ...){str(x)}
我正在尝试让这个函数兑现隐含的 x = NULL
。考虑以下因素:
对于同时使用 x
和 ...
的调用,结果如预期:
> examplefn(1,2)
num 1
如果使用显式 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
2. 另一种方法是命名参数,例如
fun2 <- function (x = NULL, y) str(x)
fun2(y = 2)
# NULL
3. 另一种方法,也许对您来说最方便,就是简单地重新排序参数,参见
fun3 <- function (..., x = NULL) str(x)
fun3(2)
# NULL
4. 最后,这里还有一个(微不足道的)可能性——在函数内部设置x <- NULL
fun4 <- function (...) {
x <- NULL
str(x)
}
fun4(2)
# NULL
但我假设你有理由希望 x
成为一个论点。