2011-05-31 116 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