2013-01-18 41 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"))