介绍
当你不确定一个函数有多少个参数输入时,可以使用...
参数占位。例如R的打印函数?print
:
print(x, ...) # ... further arguments passed to or from other methods.
help文档点出了使用方式:传递给其他方法或从其他方法传递,意思就是说有多层函数,参数由外层向内层函数传递,包括两种情况:
- 有参数名:
f <- function(v,...){
mean(v, ...)
}
f(c(1,2,NA,3), na.rm = TRUE) # 2
- 无参数名:
h <- function(...){
inputs <- list(...)
# 一些操作
...
}
进一步,可以根据传入的顺序捕获参数:
g <- function(...){
paste0("第一个参数是:", ..1,
",第二个参数是:", ..2,
",第三个参数是:", ..3
)
}
g(1,2,3) # [1] "第一个参数是:1,第二个参数是:2,第三个参数是:3"
如果参数是...,但是输入的多个参数保存在一个list里面,可以使用以下方式:
do.call(g, list(1, 2, 3))
# [1] "第一个参数是:1,第二个参数是:2,第三个参数是:3"
补充
此外,存在一些衍生函数用于提取...
参数特征,如下:
f <- function(...){
print(...length()) # 提取...参数长度
print(...names()) # 提取...参数名字
print(...elt(2)) # 相当于..<n>
}
f(1,x=2,3,4)
# [1] 4
# [1] "" "x" "" ""
# [1] 2