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(...)
。但是,这两个功能并不完全相同。(有关差异,请参见答案中的示例。)有人可以告诉我它们之间的实际区别是什么,我应该使用哪一个?
list
和c
函数都以这种方式工作,但是两者都是原语,因此我无法轻松地检查它们的源代码以了解它们如何工作。