2013-05-27 5 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 < - function (f1, f2, ..., args.f2 = list()) '. – baptiste

+0

Помимо упоминания идиомы @baptiste (которая часто используется в источниках R), вы находитесь на территории обработки аргументов. Вы можете захватить '...', получить имена аргументов 'f1' и' f2' через 'formals()', а затем обработать захваченный список '...' для извлечения аргументов для каждой функции. Что происходит, когда 'f1' и' f2' имеют одинаковые именованные аргументы? Вот почему идея баптиста очень проста; вам просто нужно '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)) 

(тестировался, но вы получили суть)

Смежные вопросы