2013-01-18 33 views
12

Là một phần của hàm, tôi muốn xuất danh sách tất cả đối số và giá trị của chúng, kể cả giá trị mặc định. Ví dụ, một hàm với những lập luận này:match.call với đối số mặc định

foo <- function(x=NULL,y=NULL,z=2) { 
    #formals() 
    #as.list(match.call())[-1] 
    #some other function?.... 
} 

Để cung cấp cho đầu ra như vậy:

> foo(x=4) 

$x 
[1] 4 

$y 
NULL 

$z 
[1] 2 

formals không cập nhật để cung cấp cho các giá trị tham số giá trị khi hàm được gọi. match.call, nhưng không cung cấp mặc định của các đối số. Có một chức năng khác ra khỏi đó sẽ cung cấp đầu ra như tôi muốn?

Trả lời

23

Hy vọng rằng, điều này không dẫn đến con rồng.

foo <- function(x=NULL,y=NULL,z=2) { 
    mget(names(formals()),sys.frame(sys.nframe())) 

} 

foo(x=4) 

$x 
[1] 4 

$y 
NULL 

$z 
[1] 2 

print(foo(x=4)) 

$x 
[1] 4 

$y 
NULL 

$z 
[1] 2 
11

bạn có thể sử dụng một hỗn hợp của 2, match.callformals

foo <- function(x=NULL,y=NULL,z=2) 
{ 
    ll <- as.list(match.call())[-1]  ## 
    myfor <- formals(foo)    ## formals with default arguments 
    for (v in names(myfor)){ 
      if (!(v %in% names(ll))) 
       ll <- append(ll,myfor[v]) ## if arg is missing I add it 
      } 
    ll 
} 

Ví dụ:

foo(y=2) 
$y 
[1] 2 

$x 
NULL 

$z 
[1] 2 

> foo(y=2,x=1) 
$x 
[1] 1 

$y 
[1] 2 

$z 
[1] 2 
4
foo <- function(x=NULL,y=NULL,z=2) { 
    X <- list(x,y,z); names(X) <- names(formals()); X 
} 
z <- foo(4) 
z 
#------ 
$x 
[1] 4 

$y 
NULL 

$z 
[1] 4 
+0

Umm, có vẻ là một lỗi đánh máy, tôi đoán nó phải là 'x <- list (x, y, z)'. Nếu bạn tạo danh sách theo cách thủ công, tại sao bạn không chỉ đặt tên cho các mục trực tiếp? – Roland

+0

Sửa lỗi đánh máy. Câu hỏi nên được chuyển đến OP. –

3

Đây là một nỗ lực để quấn logic này trong một chức năng tái sử dụng để thả trong thay vì match.call:

match.call.defaults <- function(...) { 
    call <- evalq(match.call(expand.dots = FALSE), parent.frame(1)) 
    formals <- evalq(formals(), parent.frame(1)) 

    for(i in setdiff(names(formals), names(call))) 
    call[i] <- list(formals[[i]]) 


    match.call(sys.function(sys.parent()), call) 
} 

Nó trông giống như nó hoạt động:

foo <- function(x=NULL,y=NULL,z=2,...) { 
    match.call.defaults() 
} 


> foo(nugan='hand', x=4) 
foo(x = 4, y = NULL, z = 2, ... = pairlist(nugan = "hand")) 
Các vấn đề liên quan