2013-05-27 14 views
7

Come si scrive una funzione principale abbastanza flessibile per passare argomenti aggiuntivi a più funzioni? Semplici tentativi sono falliti:Passando lungo argomenti di ellissi a due diverse funzioni?

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

Posso vedere come questo potrebbe essere possibile esaminando formali e la congruenza argomenti di chiamata in puntini di sospensione per le formali di ogni funzione. C'è un modo migliore, però?

+3

è possibile passare un elenco per una delle sottofunzioni, vale a dire 'mainF < - function (f1, f2, ..., args.f2 = list()) '. – baptiste

+0

A parte l'idioma che @baptiste menziona (che è spesso usato nelle fonti R), ci si trova in territorio di elaborazione degli argomenti. Puoi prendere '...', ottenere i nomi degli argomenti di 'f1' e' f2' tramite 'formals()', quindi elaborare l'elenco '...' afferrato per estrarre gli argomenti per ogni funzione. Cosa succede tuttavia quando 'f1' e' f2' hanno gli stessi argomenti con nome? Ecco perché l'idea di baptiste è carina e semplice; hai solo bisogno di 'do.call (f2, args.f2)' per chiamare 'f2' con l'insieme corretto di argomenti come specificato dall'utente. –

+0

È un ottimo modo di dire. Probabilmente l'ho visto un milione di volte nella base R, ma non mi è venuto in mente di farlo in quel modo per qualche ragione. @baptiste post come risposta? –

risposta

3

È possibile passare un elenco per una delle sottofunzioni, cioè

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

(non testato, ma si ha l'essenza)

Problemi correlati