2016-11-16 33 views
5

Dla dowolnej funkcjiGet nazwy argument funkcji R

f <- function(x, y = 3){ 
    z <- x + y 
    z^2 
} 

Chcę być w stanie podjąć nazwy argument f

> argument_names(f) 
[1] "x" "y" 

to jest możliwe?

+3

Sprawdź "? Formals' – Dason

+0

Awesome! Obie działają. Zapraszam do odpowiedzi. Przyjmę pierwszy. – landau

+0

help ("args") lub jedna z funkcji tam połączonych. – Roland

Odpowiedz

10

formalArgs i formals to dwie funkcje, które przydałyby się w tym przypadku. Jeśli chcesz tylko nazwy parametrów, wówczas bardziej przydatne będzie ustawienie formalArgs, ponieważ po prostu podaje nazwy i ignoruje wszelkie wartości domyślne. formals podaje listę jako dane wyjściowe i podaje nazwę parametru jako nazwę elementu na liście oraz wartość domyślną jako wartość elementu.

f <- function(x, y = 3){ 
    z <- x + y 
    z^2 
} 

> formalArgs(f) 
[1] "x" "y" 
> formals(f) 
$x 


$y 
[1] 3 

Moim pierwszym skojarzeniem było tylko sugerować formals i jeśli tylko chcieliśmy nazwy parametrów można użyć nazwy jak names(formals(f)). Funkcja formalArgs jest właśnie otoką, która robi to za ciebie, więc działa w dowolny sposób.

Edycja: Należy zauważyć, że funkcje prymitywne technicznie nie mają "formals", więc ta metoda zwróci wartość NULL, jeśli jest używana dla elementów pierwotnych. Sposób obejścia polega na tym, aby najpierw owinąć funkcję w args przed przejściem do formalArgs. Działa to niezależnie od tego, czy funkcja jest prymitywna czy nie.

> # formalArgs will work for non-primitives but not primitives 
> formalArgs(f) 
[1] "x" "y" 
> formalArgs(sum) 
NULL 
> # But wrapping the function in args first will work in either case 
> formalArgs(args(f)) 
[1] "x" "y" 
> formalArgs(args(sum)) 
[1] "..." "na.rm" 
+0

To nie działa, na przykład dla '^' lub 'log': \ – MichaelChirico

+0

@ Michael Christy Hmmm. Wygląda na to, że wszystko, co jest po prostu opakowaniem dla wywołania typu "pige" ma ten sam problem. – Dason

+0

Tak, próbowałem znaleźć wszystkie jednokrotne funkcje w bazie i wpadłem na ten problem - wszystkie dobre są tylko prymitywnymi owijkami – MichaelChirico