给我一个有意义的例子来理解r中的`...`

时间:2013-11-29 13:00:38

标签: r

mean(x, ...)
...
further arguments passed to or from other methods.

?"..."

R函数中的“...”参数是专门处理的,因为它匹配零个,一个或多个实际参数(以及对象)。 R中添加了一种机制,允许“...”作为通用函数的签名。当匹配“...”的所有参数来自指定的类或该类的某个子类时,将选择并调用为此类函数定义的方法。

你能给我一个有意义且简单的例子来帮助我理解...在这里的效果吗?

2 个答案:

答案 0 :(得分:1)

您可以使用...将附加配置参数传递给可能需要它们的方法。

 print2 <- function (x, ...) {
     UseMethod('print2', x)
 }
 print2.integer <- function (x, ...) {
     cat(x)
 }

 print2.character <- function (x, ...) {
     config <- list(...)

     # an option to convert to uppercase before printing
     if (isTRUE(config$uppercase)) {
         cat(toupper(x))
     } else {
         cat(x)
     }
 }

# no config options for integers
print2(1L)
  1

# the string method does have configuration
print2(c('a', 'b'))
  a b
print2(c('a', 'b'), uppercase = TRUE)
  A B

向泛型函数添加...不是必需的,但它可以使单个方法更具可配置性。如果您需要澄清,请在下面留言。

答案 1 :(得分:0)

这些有一些用途。第一个是在R函数中有命名参数,所以在sum这样的函数中,参数是'...'和'na.rm'。这意味着一个函数通常会将第一个输入作为第一个参数,第二个是第二个可以给它不同的东西。你可以说sum(1, 2, c(1, 2, 3))。如果没有它,你必须在函数调用之前将所有内容打包。省略号的第二个也是更有价值的用途是构造函数。我在传递中创建了一个函数,它在读取数据时添加了一些检查。它基本上会以不会失败的方式重写对read.csv的调用,文件总是被更改,所以我的代码不必更改。它将读取第一行并查找我想要的字段,并将它们按照从读取标题和NULL所有其他字段找到的顺序放置。我想使用它更多的地方,它似乎永远不会工作,因为其他方面会改变,分隔符,要跳过的行数等等。我要么必须在我的函数定义中放入read.csv的每个可能的参数,可能不会是默认值或给它'...'。

这意味着如果我有一个文件test.txt并且我想要字段'a','b'和'c'我会说safe.read.csv('test.txt', c('a', 'b', 'c'))这会将重写传递给read.csv('test.txt', col.classes = c(NA, NA, numeric, NA, integer, integer))或在某种程度上的东西。这都假设了默认的sep参数。如果改变了,我必须重新定义我的函数safe.read.csv('test.txt', c('a', 'b', 'c'), x = '|')read.csv('test.txt', col.classes = c(NA, NA, numeric, NA, integer, integer), sep = x)。如果你用'...'定义它,虽然你可以传递任何数量的东西,里面的每个函数都将查看'...'的内容并在使用它们时应用它们。所以我的函数没有定义的x参数,它会改为'...'而我会说函数safe.read.csv('test.txt', c('a', 'b', 'c'), sep = '|')而当它来到read.csv时它会选择它。因此,您可以将任何参数传递给任何嵌套函数,而无需将其显式添加到函数arg列表中。