2013-05-27 88 views
7

如何編寫一個足夠靈活的主函數來將多個參數傳遞給多個函數?簡單的嘗試都失敗了:將省略號參數傳遞給兩個不同的函數?

> mainF <- function(f1,f2,...) { 
+  f2(X=f1(...), ...) 
+ } 
> mainF(function(x) x, function(X, y) X*y, x=5, y=3) 
Error in f2(X = f1(...), ...) : unused argument (x = 5) 

我可以看到這是如何通過檢查甲醛和省略號每個功能的甲縮醛匹配調用參數是可能的。但是有更好的方法嗎?

+3

你可以通過列表的子功能之一,即'MAINF < - 函數(f1,f2,...,args.f2 = list())'。 – baptiste

+0

除了成語@baptiste提及(它常常用於R源),你進入了參數處理領域。你可以抓住'...',通過'formals()'得到'f1'和'f2'的參數名,然後處理抓取的'...'列表以提取每個函數的參數。然而,當'f1'和'f2'具有相同的命名參數時會發生什麼?這就是爲什麼baptiste的想法很簡單;你只需要'do.call(f2,args.f2)'用用戶指定的正確的一組參數調用'f2'。 –

+0

這是一個很棒的成語。我可能在R的基礎上看過它一百萬次,但是出於某種原因我沒有這樣做。 @baptiste發帖作爲答案? –

回答

3

您可以通過列表的子功能之一,即

mainF <- function(f1, f2, ..., args.f2 = list()) { 
    do.call(f2, c(X=f1(...), args.f2)) 
} 

mainF(function(x) x, function(X, y) X*y, x=5, args.f2 = list(y=3)) 

(未經測試,但你得到的要點)

相關問題