在R中将参数替换为列表

9
有时候,一个函数可能会有任意数量的参数。例如,包shiny的bootstrapPage函数。如果我有一个数据框,并且想要为每一行创建一个小部件,那么我就找不到一种漂亮的方法来根据数据框的行数传递参数数量。到目前为止,我生成脚本并使用eval(parse(text="..."))的技巧解决这个问题。
事实上,在R中传递给函数的参数结构(键和值)类似于list,所以我想知道是否有一种方法可以将参数作为列表传递给R中的函数。
更具体地说,如果我有一个函数f和一个列表argv,是否有一种方法可以根据argv的名称与f的参数名称的匹配以及argv中的位置与f的参数位置来将对象传递给f
例如,让我们假设
f <- function(a, b) a + b
argv <- list(a=1, b=2)

我应该如何将argv传递给等同于f(a=argv$a, b=argv$b)f函数?

或者,如果我们有:

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

我应该如何将argv传递给f函数,使其等价于f(a=argv$a, b=argv$b, argv[[3]], argv[[4]], argv[[5]])

谢谢!

1个回答

12
您正在寻找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

很棒的示例集合。这是语言中真正值得在“R入门指南”中更好地介绍的一个特性。 - IRTFM
2
对于这些出色的示例,点赞 +1 - Ricardo Saporta

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接