2013-01-18 82 views
12

作爲函數的一部分,我想輸出所有參數及其值的列表,包括默認值。例如,具有這些參數的函數:帶默認參數的match.call

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

爲了讓輸出這樣:

> foo(x=4) 

$x 
[1] 4 

$y 
NULL 

$z 
[1] 2 

formals不更新,得到的值的參數值時調用該函數。 match.call確實,但不提供參數的默認值。是否有另外一個功能可以根據需要提供輸出?

回答

23

希望這不會導致小龍。

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

可以使用的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 
} 

混合例如:

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

嗯,似乎有一個錯字,我想它應該是'x < - list(x,y,z)'。如果您手動創建列表,爲什麼不直接命名條目? – Roland

+0

修復了錯字。這個問題應該針對OP。 –

3

這裏是包裝這一邏輯的可重複使用的功能減退,而不是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) 
} 

它看起來像它的工作原理:

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