2013-05-27 19 views
7

Birden fazla işlevin yanı sıra ekstra argümanlar iletecek kadar esnek bir ana işlev nasıl yazarım? Basit girişimleri başarısız oldu:Elips argümanları boyunca iki farklı fonksiyona geçmek?

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

bu Formals inceleyerek ve her fonksiyonun Formaller için üç nokta çağrı argümanları eşleştirerek mümkün olabilir görebilirsiniz. Yine de daha iyi bir yolu var mı?

Sen alt-fonksiyonların birine bir liste geçebilir
+3

, yani 'mainF < - işlev (f1, f2, ..., args.f2 = list()) '. – baptiste

+0

(R kaynaklarında sıklıkla kullanılan) baptiste ifadelerinden başka, argüman işlem bölgesindesiniz. '' '', 'F1' ve' f2''nün argüman isimlerini 'formals() ile alabilir, sonra her işlev için argümanları ayıklamak için yakalanan' ... 'listesini işleyebilirsiniz. Ancak f1' ve f2’nin aynı argümanlara sahip olması durumunda ne olur? Bu yüzden baptiste'nin fikri çok basit; sadece kullanıcı tarafından belirtilen doğru argüman setiyle 'f2' 'yi çağırmak için' do.call (f2, args.f2) 'ye ihtiyacınız var. –

+0

Bu harika bir deyim. Muhtemelen baz milyonda bir milyon kere görmüştüm, ama bir sebepten dolayı bu şekilde yapmam mümkün değildi. Baptiste yazı bir cevap olarak mı? –

cevap

3

, yani

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

(denenmemiş, ama özü var) Eğer alt-fonksiyonların birine listesini geçebilir