在R中应用任意函数的函数

时间:2011-05-31 18:53:34

标签: r

如何在R中实现函数apply.func(func, arg.list),它将任意函数func和合适的列表arg.list作为参数,并返回调用func的结果使用arg.list中包含的参数。 E.g。

apply.func(foo, list(x="A", y=1, z=TRUE))

相当于

foo(x="A", y=1, z=TRUE)

谢谢!

P.S。 FWIW,Python的等价物apply.func就像是

def apply_func(func, arg_list):
    return func(*arg_list)

def apply_func(func, kwarg_dict):
    return func(**kwarg_dict)

或其中的一些变体。

2 个答案:

答案 0 :(得分:17)

我认为do.call正是您所寻找的。您可以通过?do.call了解相关信息。

人们如何使用do.call的典型示例是rbind数据框或矩阵:

d1 <- data.frame(x = 1:5,y = letters[1:5])
d2 <- data.frame(x = 6:10,y = letters[6:10])

do.call(rbind,list(d1,d2))

这是使用sum的另一个相当简单的例子:

do.call(sum,list(1:5,runif(10)))

答案 1 :(得分:8)

R允许函数作为参数传递给函数。这意味着您可以按如下方式定义apply.func(其中f是一个函数,...表示所有其他参数:

apply.func <- function(f, ...)f(...)

然后,您可以使用apply.func并指定参数有意义的任何函数:

apply.func(paste, 1, 2, 3)
[1] "1 2 3"

apply.func(sum, 1, 2, 3)
[1] 6

但请注意,以下内容可能无法产生您期望的结果,因为mean将矢量作为参数:

apply.func(mean, 1, 2, 3)
[1] 1

请注意,还有一个名为do.call的基本R函数可以有效地执行相同的操作。