2013-05-27 25 views
7

Làm cách nào để viết một hàm chính đủ linh hoạt để chuyển các đối số thừa cùng với nhiều hàm? Nỗ lực đơn giản đã thất bại:Đi dọc theo các đối số dấu ba chấm tới hai hàm khác nhau?

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

Tôi có thể xem điều này có thể bằng cách kiểm tra formals và đối số cuộc gọi phù hợp trong dấu ba chấm tới các formals của từng hàm. Có cách nào tốt hơn không?

+3

bạn có thể vượt qua một danh sách để một trong những subfunctions, tức là 'mainF < - Hàm (f1, f2, ..., args.f2 = list()) '. – baptiste

+0

Khác với các thành ngữ @ baptiste đề cập (thường được sử dụng trong các nguồn R), bạn đang vào lãnh thổ xử lý đối số. Bạn có thể lấy '...', lấy các tên đối số của 'f1' và' f2' qua 'formals()', sau đó xử lý danh sách '...' được lấy ra để trích xuất đối số cho mỗi hàm. Tuy nhiên, điều gì sẽ xảy ra khi 'f1' và' f2' có cùng các đối số được đặt tên? Đây là lý do tại sao ý tưởng của baptiste thì đẹp một cách đơn giản; bạn chỉ cần 'do.call (f2, args.f2)' để gọi 'f2' với tập hợp các đối số chính xác như được chỉ định bởi người dùng. –

+0

Đó là một thành ngữ tuyệt vời. Tôi đã có thể nhìn thấy nó một triệu lần trong cơ sở R nhưng nó đã không xảy ra với tôi để làm điều đó theo cách đó vì một lý do nào đó. @baptiste đăng dưới dạng câu trả lời? –

Trả lời

3

Bạn có thể vượt qua một danh sách để một trong những subfunctions, tức là

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

(chưa được kiểm tra, nhưng bạn có các ý chính)

Các vấn đề liên quan