4

list(...)我对 R 和 S-plus的工作方式感到困惑。对于以下代码

pp <- function(x, ...) { print( length( list(...)))}
pp(1,,,1)

在 S-Plus 中,它可以工作,但在 R 中,它给出“ Error in print(length(list(...))) : argument is missing, with no default

我对它在 R 中的工作原理以及如何list(...)在 R 函数中获取值更感兴趣。

4

2 回答 2

4

我不确定为什么在 S-plus 中允许使用这种语法,但在 R 中却不允许。

不过,这里有一些 R 代码,它们的效果基本相同:

pp <- function(x, ...) {
    print(length(as.list(match.call(expand.dots=FALSE))[["..."]]))
}
pp(1,,,1)
# [1] 3

或者,使用这里的技巧:

ppp <- function(x, ...) {
    print(length(substitute(...())))
}
ppp(1,,,1)
# [1] 3
于 2013-06-06T21:24:41.143 回答
0

当这些参数打算在 arg 列表中匹配时,您不能在dots和之后的任何参数中使用未命名(编辑:...和缺少)参数。dots为未命名参数自动发生的位置匹配仅在点之前的命名参数(在 arg 列表中)的典型参数处理中“起作用”。

> pp1 <- function(x, ...) { length( list(...))}
> pp1(1,z=NULL,xx=NULL,1)
[1] 3
> pp2 <- function(x, z, ...) { length( list(...))}
> pp2(1,z=NULL,xx=NULL,1)
[1] 2
> pp3 <- function(x, z, ...) { length( list(...))}
> pp3(1, ,xx=NULL,1)
[1] 2

> pp <- function(x, ...) { length( list(...))}
> pp(1, , xx=NULL, 1)
Error in pp(1, , xx = NULL, 1) : argument is missing, with no default

阅读match.call的帮助页面,第二种“常用情况”描述为:

将大部分调用传递给另一个函数,通常是model.frame。这里常见的习惯用法是使用expand.dots = FALSE,并删除匹配调用的...元素。

参数匹配的顺序(当不被规避时)在第 4.3.2 节“参数匹配”中描述:

  1. 位置匹配。任何不匹配的形式参数都按顺序绑定到未命名的提供参数。如果有一个 '...' 参数,它将占用剩余的参数,无论是否标记。

如果任何参数仍然不匹配,则声明错误。

于 2013-06-06T22:05:14.707 回答