【问题标题】:R - Ellipse (`...`) and `NULL` in function parametersR - 函数参数中的椭圆(`...`)和`NULL`
【发布时间】:2019-06-23 12:23:23
【问题描述】:

设想

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 = NULL 如果缺少x,则定义中的默认值。在examplefn(2) 中,您基本上设置了x = 2。您希望x 始终为NULL 并且examplefn(2) 等于examplefn(NULL,2)
  • 是的,这就是目标。我显然不理解评估,但我期待未命名的2 继续代表椭圆......
  • 您可能会从阅读这部分语言定义中受益(我什至建议阅读整个文档):cran.r-project.org/doc/manuals/r-release/…

标签: r function parameter-passing ellipse


【解决方案1】:

x = NULL 的定义仅在未提供 x 值时使用。所以当写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 &lt;- NULL

fun4 <- function (...) {
  x <- NULL
  str(x)
}
fun4(2)    
# NULL

但我假设您有理由希望 x 成为一个论点。

【讨论】:

  • 3.确实是最方便的。谢谢。
  • 然而,在我的实际应用程序中,我失去了管道(magrittr)x 参数的选项(它是list) - 如果它是NULL,它是创建的,如果给定则修改...
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-08-11
  • 1970-01-01
  • 1970-01-01
  • 2012-12-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多