2013-04-09 8 views
7

Gibt es eine Möglichkeit, alle Funktionsparameter innerhalb einer Funktion zu erhalten?Erhalten Sie eine Liste aller Funktionsparameter von innerhalb der Funktion

match.call() gibt keine Parameter mit Standardeinstellungen zurück, aber nicht überschrieben. Zum Beispiel:

xf <- function (a, b="Hi", c=TRUE) { 
    print(as.list(match.call(expand.dots=FALSE))) 
} 

>xf(3) 
[[1]] 
xf 

$a 
[1] 3 

Ich schreibe ein Paket mit einer Funktion, die eine vorhandene Funktion aufruft, aber ich möchte in der Lage Standardwerte festlegen, die nicht auf der vorhandenen Funktion sind. (Ich hatte geplant, über die Verwendung der Liste von match.call, vorbei in die andere Funktion mit do.call und Rückkehr das Ergebnis

Update:.. Eine interessante Frage, die S3 betrifft Verfahren habe ich eine neue S3-Verfahren und verwendet @ Ferdinand.krafts Antwort as.list(environment(), all.names=TRUE) Das Argument all.names hält Namen, die mit einem . in der Liste beginnen.Es stellt sich heraus, dass der Methodenversand der Funktionsumgebung mehrere Argumente hinzufügt, einschließlich .Generic.Class und einigen anderen Sie übergeben diese an die Funktion in do.call. Eine der anderen Antworten kann eine bessere Allround-Lösung sein, aber ich mag die Einfachheit von as.list(environment()).

+0

tut 'arg s' was du willst? –

Antwort

10

verwenden Sie können am Anfang der Funktion, die Umwelt Rück auch:

xf <- function (a, b="Hi", c=TRUE) { 
    as.list(environment(), all=TRUE) 
} 

Ergebnis:

> xf(a=1) 
$a 
[1] 1 

$b 
[1] "Hi" 

$c 
[1] TRUE 
+0

Ich mag die Einfachheit. – Seth

+0

Ich auch. :-) Und es kann noch einfacher werden, wenn kein Argumentname mit einem Punkt beginnt - oder wenn Sie ihn nicht weitergeben wollen - in diesem Fall können Sie den Parameter 'all = TRUE' löschen. –

4

Sie können ls und mget verwenden. ls wird (standardmäßig), listet die Objekte im aufrufenden Rahmen (in diesem Fall innerhalb der Funktion), mget wird diese erhalten.

zB

xf <- function(a,b='Hi',c){ 
    # this gets the current definitions of `a`, `b`, and `c` 
    incall <-mget(ls()) 
    incall} 

xf(3) 
## $a 
## [1] 3 
## 
## $b 
## [1] "Hi" 
## 
## $c 

können Sie dann do.call(whatever, incall)

+0

Nette Verwendung von mget. – Seth

Verwandte Themen