2016-07-05 22 views
1

Gibt es eine Möglichkeit, auf die Auswahlmöglichkeiten eines Arguments einer Funktion zuzugreifen?Zugriffsmöglichkeiten aus formalem Argument der Funktion

In diesem dummen Beispiel:

noise <- function(animal = c("dog","cat","chicken","pig")){ # default animal is "dog" 
    animal <- match.arg(animal) 
    sound <- c("woof","meow","cluck","oink")[match(animal, c("dog","cat","chicken","pig"))] 
    sound 
} 
noise("chicken") # returns desired result 

Ich würde c("dog","cat","chicken","pig") durch den Zugriff auf den Vektor der Wahl aus der Erklärung, etwas ähnliches zu (so dass diese nach oben) zu vermeiden, wie Abtippen:

noise <- function(animal = c("dog","cat","chicken","pig")){ 
     animal <- match.arg(animal) 
     sound <- c("woof","meow","cluck","oink")[match(animal, self.choices("animal"))] 
     sound 
    } 

Antwort

3

try dies: eval(formals(noise)[["animal"]])

+0

Das ist super, danke - das ist möglich, weil es zur Laufzeit ausgewertet wird? Weil bei der Definition der Funktion 'noise' die Funktion' noise' noch nicht definiert wurde ... – C8H10N4O2

+0

Ich denke, es ist ein glückliches Ergebnis einer faulen Bewertung: R analysiert zuerst das Skript, und zu der Zeit bewertet es den Körper bereits kennt die Signatur der Funktion – baptiste

+0

BTW gibt es wahrscheinlich einen Namen-agnostischen Weg, um diese Informationen innerhalb der Funktion zu erhalten, aber ich erinnere mich nie, welche von 'sys.frame()' und seine Geschwister relevant ist. – baptiste