有时会有一个具有任意数量参数的函数。例如,包的闪亮bootstrapPage
功能。如果我有一个data.frame并且我想为一行创建一个小部件,那么我还没有找到一种根据data.frame的行号传递参数数量的好方法。到目前为止,我生成脚本并使用eval(parse(text="..."))
实际上,传递给R中的函数的参数结构(键和值)类似于list
,所以我想知道是否有办法将参数作为R中的列表传递。< / p>
更具体地说,如果我有一个函数f
和一个列表argv
,是否可以根据匹配情况将argv
中的对象传递给f
argv
的名称和f
的参数名称,argv
中的位置以及f
参数中的位置?
例如,让
f <- function(a, b) a + b
argv <- list(a=1, b=2)
我应该如何将argv
传递给相当于f
的{{1}}?
或者如果我们有:
f(a=argv$a, b=argv$b)
我应该如何将f <- function(a, b, ...) { # some codes }
argv <- list(a = 1, b = 2, 3, 4, 5)
传递给相当于argv
的{{1}}?
谢谢!
答案 0 :(得分: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