首页 > 解决方案 > R - 函数参数中的椭圆(`...`)和`NULL`

问题描述

预见

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定义。

如何防止后者?

标签: rfunctionparameter-passingellipse

解决方案


x = NULL仅当未提供值时才使用该定义x。因此,当写入读取的内容examplefn(2)时(参数编号 1 也是如此)以及结果。Rexamplefn(x = 2)x

如果你想规避这个问题,这里有一些方法:

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成为一个论点。


推荐阅读