【发布时间】:2011-03-04 16:40:47
【问题描述】:
R 语言有一个很好的功能,可以定义可以接受可变数量参数的函数。例如,函数data.frame 接受任意数量的参数,每个参数都成为结果数据表中一列的数据。示例用法:
> data.frame(letters=c("a", "b", "c"), numbers=c(1,2,3), notes=c("do", "re", "mi"))
letters numbers notes
1 a 1 do
2 b 2 re
3 c 3 mi
函数的签名包括一个省略号,如下所示:
function (..., row.names = NULL, check.rows = FALSE, check.names = TRUE,
stringsAsFactors = default.stringsAsFactors())
{
[FUNCTION DEFINITION HERE]
}
我想编写一个函数来做类似的事情,获取多个值并将它们合并为一个返回值(以及进行一些其他处理)。为了做到这一点,我需要弄清楚如何从函数内的函数参数中“解包”...。我不知道该怎么做。 data.frame的函数定义中的相关行是object <- as.list(substitute(list(...)))[-1L],我看不懂。
那么如何将函数签名中的省略号转换为例如列表?
更具体地说,我如何在下面的代码中写get_list_from_ellipsis?
my_ellipsis_function(...) {
input_list <- get_list_from_ellipsis(...)
output_list <- lapply(X=input_list, FUN=do_something_interesting)
return(output_list)
}
my_ellipsis_function(a=1:10,b=11:20,c=21:30)
编辑
似乎有两种可能的方法来做到这一点。他们是as.list(substitute(list(...)))[-1L] 和list(...)。但是,这两个做的事情并不完全相同。 (有关差异,请参阅答案中的示例。)谁能告诉我它们之间的实际区别是什么,我应该使用哪一个?
【问题讨论】:
标签: r function parameters ellipsis variadic