"Richtige" Methode zur Angabe optionaler Argumente in R-Funktionen

165

Ich interessiere mich für die "richtige" Art, Funktionen mit optionalen Argumenten in R zu schreiben. Im Laufe der Zeit bin ich auf einige Codeteile gestoßen, die hier einen anderen Weg einschlagen, und ich konnte keine richtige (offizielle) Position finden Zu diesem Thema.

Bis jetzt habe ich optionale Argumente wie diese geschrieben:

fooBar <- function(x,y=NULL){
  if(!is.null(y)) x <- x+y
  return(x)
}
fooBar(3) # 3
fooBar(3,1.5) # 4.5

Die Funktion gibt einfach ihr Argument zurück, wenn nur angegeben xwird. NULLFür das zweite Argument wird ein Standardwert verwendet. Wenn dies nicht der Fall ist NULL, fügt die Funktion die beiden Zahlen hinzu.

Alternativ könnte man die Funktion so schreiben (wobei das zweite Argument durch den Namen angegeben werden muss, aber man könnte auch unlist(z)oder z <- sum(...)stattdessen definieren ):

fooBar <- function(x,...){
  z <- list(...)
  if(!is.null(z$y)) x <- x+z$y
  return(x)
}
fooBar(3) # 3
fooBar(3,y=1.5) # 4.5

Persönlich bevorzuge ich die erste Version. Ich kann jedoch mit beiden gut und schlecht sehen. Die erste Version ist etwas weniger fehleranfällig, aber die zweite könnte verwendet werden, um eine beliebige Anzahl von Optionen aufzunehmen.

Gibt es eine "richtige" Möglichkeit, optionale Argumente in R anzugeben? Bisher habe ich mich für den ersten Ansatz entschieden, aber beide können sich gelegentlich etwas "hackig" fühlen.

SimonG
quelle
Überprüfen Sie den Quellcode xy.coordsauf einen häufig verwendeten Ansatz.
Carl Witthoft
5
Der xy.coordsvon Carl Witthoft l erwähnte Quellcode ist unter xy.coords
RubenLaguna

Antworten:

129

Sie können auch missing()testen, ob das Argument angegeben ywurde oder nicht :

fooBar <- function(x,y){
    if(missing(y)) {
        x
    } else {
        x + y
    }
}

fooBar(3,1.5)
# [1] 4.5
fooBar(3)
# [1] 3
Josh O'Brien
quelle
5
Ich mag es besser zu vermissen. Besonders wenn Sie viele NULL-Standardwerte haben, haben Sie nicht x = NULL, y = NULL, z = NULL in Ihrer
Paketdokumentation
5
@rawr missing()ist auch in dem Sinne ausdrucksvoller, dass es "sagt, was es bedeutet". Außerdem können Benutzer an Stellen, an denen dies sinnvoll ist, den Wert NULL übergeben!
Josh O'Brien
30
Für mich hat die Verwendung von Missing auf diese Weise einen großen Nachteil: Wenn Sie die Funktionsargumente überfliegen, können Sie nicht mehr sehen, welche Argumente erforderlich sind und welche Optionen.
Hadley
3
@param x numeric; something something; @param y numeric; **optional** something something; @param z logical; **optional** something something
rawr
4
missing()ist schrecklich, wenn Sie Argumente von einer Funktion an eine andere übergeben möchten.
John Smith