2013-01-18 10 views
12

Jako część funkcji, chcę wypisać listę wszystkich argumentów i ich wartości, w tym wartości domyślne. Na przykład, funkcja z tymi argumentami:match.call z domyślnymi argumentami

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

Aby dać wyjście jako takie:

> foo(x=4) 

$x 
[1] 4 

$y 
NULL 

$z 
[1] 2 

formals nie aktualizuje dać wartości argumentów wartości, gdy funkcja jest wywoływana. match.call ma, ale nie podaje wartości domyślnych argumentów. Czy istnieje inna funkcja, która zapewni wyjście tak, jak chcę?

Odpowiedz

23

Mam nadzieję, że nie prowadzi to do smoków.

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

można użyć mieszanki z 2 match.call i formals

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 
} 

Na przykład:

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, wydaje się, że jest literówka, myślę, że powinno to być 'x <- list (x, y, z)'. Jeśli tworzysz listę ręcznie, dlaczego po prostu nie nazywasz bezpośrednio wpisów? – Roland

+0

Naprawiono literówkę. Pytanie powinno zostać skierowane do PO. –

3

Oto próba zawinąć tę logikę w wielokrotnego użytku funkcji wpaść zamiast 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) 
} 

Wygląda jak to działa:

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")) 
Powiązane problemy