2011-05-31 78 views
7

适用任意一个功能如何将R中实现该功能apply.func(func, arg.list),这需要一个任意函数func和作为参合适的列表arg.list,并返回调用func包含在arg.list参数的结果。例如。功能于R中

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) 

或其某种变体。

回答

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))) 
+0

没错。谢谢! – kjo 2011-05-31 19:13:26

+0

+1首先发布... – Andrie 2011-05-31 19:16:44

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函数,它有效地执行相同的操作。没问题。

+2

'f < - match.fun(f)'将健康检查函数参数是否存在函数。 – Marek 2011-06-01 07:56:41