我喜欢看开源库的源码,在看一些R包的源码的时候,经常会碰到函数里面有一个名称是三个点(即省略号,专业术语叫ellipsis,姑且翻译为省略参数吧)的参数。例如,limma包的一个函数是这样写的:
avereps.default <- function(x,ID=rownames(x),...)
这个参数的作用是啥呢?我们来试验一下:
f1 <- function (x, y, ...) {
z <- list(...)
print(z)
}
f1(1, 2, 3, 4, 5)
会输出:
[[1]]
[1] 3
[[2]]
[1] 4
[[3]]
[1] 5
看到没有,其实就是把1、2后面的参数都放到省略参数的意思。
那这个参数一般怎么用呢?
省略参数的使用场景一般有两个:
- 参数不固定长度
例如:
my_sum <- function (...) {
# 只为了演示如何使用
# 现实中不能这么写
total <- 0
for (i in list(...)) {
total <- total + i
}
return(total)
}
my_sum(1, 2, 3)
my_sum(1, 2, 3, 4)
- 兼容其他函数的参数
如果我的函数里面要调用其他函数,如果只是直接往这个函数里面传的话,可以使用省略参数。例如:
my_print <- function (...) {
print(...)
}
一般第二种使用场景用的比较多。