2013-03-09 103 views
8

有些时候有一个函数具有任意数量的参数。例如,bootstrapPage包闪亮的功能。如果我有一个data.frame,并且我想为一行创建一个小部件,那么我还没有找到一个漂亮的方法来根据data.frame的行数传递参数的数量。到目前为止,我生成脚本,并使用eval(parse(text="..."))用R中的列表替换参数

事实上的伎俩,传递R中的功能(key和value)是类似于list,所以我想知道如果有一种方法来论证结构传递参数作为列表在R.

更具体地说,如果我有一个函数f和一个列表argv,是有办法根据argv和名称的匹配,以argv对象传递给ff的参数名称,以及argv中的位置和f参数中的位置?

例如,让

f <- function(a, b) a + b 
argv <- list(a=1, b=2) 

我应该如何通过argvf这相当于f(a=argv$a, b=argv$b)

或者,如果我们有:

f <- function(a, b, ...) { # some codes } 
argv <- list(a = 1, b = 2, 3, 4, 5) 

我应该如何通过argvf这相当于f(a=argv$a, b=argv$b, argv[[3]], argv[[4]], argv[[5]])

谢谢!

回答

11

您在查找do.call

do.call(f, argv) 

下面是一些例子

> args <- list(n = 10, mean = 3, sd = .5) 
> do.call(rnorm, args) 
[1] 3.589416 3.393031 2.928506 2.503925 3.316584 2.581787 2.686507 3.178877 
[9] 3.083885 2.821506 
> do.call(rnorm, list(10, 3, .5)) 
[1] 3.964526 2.838760 2.436684 3.068581 1.842332 3.739046 4.050525 3.097042 
[9] 3.665041 3.535947 
> f <- function(a, b) a + b 
> argv <- list(a=1, b=2) 
> do.call(f, argv) 
[1] 3 
> f <- function(a, b, ...){print(a);print(b);print(sum(...))} 
> argv <- list(a=1,b=2, 3, 4, 5) 
> do.call(f, argv) 
[1] 1 
[1] 2 
[1] 12 
+0

的例子尼斯集合。这是该语言的一个特征,在“R介绍”中确实值得更好的处理。 – 2013-03-09 18:02:32

+2

+1为伟大的例子 – 2013-03-09 18:55:16