2011-12-05 44 views
10

Tôi có hàm f() có một số tham số được đặt tên. Nó gọi hàm g() và tôi muốn chuyển tất cả các tham số của f cho nó. Điều này có thể không?Truy cập tất cả các đối số hàm trong R

dùng ... chỉ bao gồm các đối số thêm:

f=function(a,callback,b,c,d,...){ 
    z=a-b 
    callback(z,...) 
    } 

g=function(z,...){ 
    print(list(...)) #Only shows $e 
    print(z) #-1 
    print(a,b,c,d) #'a' not found 
} 

f(1,g,2,3,d=4,e=5); 

Tôi nghĩ formals() là câu trả lời, nhưng nó chỉ có vẻ là tên đối số, không phải giá trị của họ!

f=function(a,callback,b,c,d,...){ 
    z=a-b 
    callback(z,formals()) 
    } 

g=function(z,...){ 
    args=list(...)[[1]] 
    print(args$a) #(no output) 
    print(class(args$a)) #"name" 
} 

f(1,g,2,3,d=4,e=5); 

Có thể không? Cảm ơn.

+1

Hãy xem mã cho 'lm' và' glm' để xem cách thực hiện. –

+0

@HongOoi Cảm ơn; nó được thực hiện với match.call (tức là giống như câu trả lời của Anton), mặc dù IIUC nó chọn chỉ truyền một số arg, chứ không phải tất cả chúng. –

Trả lời

15

Vâng, một cái gì đó như thế này chắc chắn là có thể. Bạn chỉ nên hình dung của chúng ta cho chính mình trong đó khung/điểm bạn muốn đánh giá các đối số của f mà sau đó được chuyển tiếp đến g. Thủ tục điển hình bao gồm match.call() gọi bên trong f để thực sự ghi lại biểu thức cuộc gọi mà f được gọi với, sau đó thay đổi biểu thức cuộc gọi vì nó sẽ thuận tiện cho bạn (vd lọc ra các arg không cần thiết, thêm mới , vv) và sau đó đánh giá biểu thức cuộc gọi mới thông qua cuộc gọi eval(). Vì vậy, một cái gì đó như thế này nên (hầu như) làm việc:

f <- function(a, callback, b, c, d, ...) { 
    # Grab the "f" call expression 
    fcall <- match.call(expand.dots = FALSE) 

    # Construct the new call expression 
    fcall[[1]] <- callback 
    # Filter out/add new args 
    fcall$callback <- NULL 
    fcall$z <- z 

    # Do the call 
    eval(fcall, parent.frame()) 
} 
+0

Hoặc bạn chỉ có thể vượt qua cùng với chính mình. Dễ hiểu hơn nhiều. – hadley

+0

@hadley Có, nhưng khó hơn để duy trì khi danh sách đối số thay đổi. Sau khi xem xét tất cả các lựa chọn, trong mã thực tế của tôi, tôi đã đi cho một đối số danh sách được đặt tên có chứa tất cả các đối số khác. I E. _Giới thiệu đối tượng tham số_ trong thuật ngữ tái cấu trúc. Vì vậy, tôi chỉ cần đi qua một đối số để f() và cùng một đối số được trao cho g(). –

+0

Ném lỗi cho tôi. –

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