mean(x, ...)
...
further arguments passed to or from other methods.
?"..."
"..."R 函数中的参数被特殊处理,因为它匹配零个、一个或多个实际参数(因此,对象(。R中添加了一种机制,以允许"..."作为泛型函数的签名。当所有参数都匹配"..."时,将选择并调用为此类函数定义的方法来自指定的类或该类的某个子类。
你能给我一个有意义和简单的例子来帮助我理解...
在这里的效果吗?
您可以使用...将附加配置参数传递给可能需要它们的方法。
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
添加。。。泛型函数不是必需的,但它可以使单个方法更易于配置。如果您需要澄清,请在下面发表评论。
这些有一些用途。首先,在 R 函数中具有命名参数,因此在 sum 等函数中,参数是"..."。和"娜.rm"。这意味着一个函数通常会将第一个输入作为第一个参数,第二个输入作为第二个参数,您可以给它一些不同的东西。你可以说sum(1, 2, c(1, 2, 3))
.如果没有它,您必须在函数调用之前打包所有内容。省略号的第二个也是更有价值的用途是函数的构造。我在传递中创建了一个函数,该函数在读取数据时添加了一些检查。它基本上会重写读取调用.csv以一种不会失败的方式,文件总是在更改,所以我的代码不必更改。它将读取第一行并查找我说我想要的字段,并按照仅读取标题和 NULL 所有其他字段找到的顺序放置它们。我想在更多的地方使用它,但它似乎从未奏效,因为其他方面会发生变化,分隔符、要跳过的行数等。我要么必须在我的函数定义中输入每个可能的参数来读取.csv这可能不是默认值,要么给它'...'。
这意味着如果我有一个文件测试.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 = '|')
,当涉及到阅读时.csv它会选择它。因此,您可以将任何参数传递给任何嵌套函数,而无需将其显式添加到函数参数列表中。