2015-03-09 3 views
6

Ich möchte eine Funktion schreiben, die eine von zwei verschiedenen statistischen Methoden auf ihre Eingabe anwendet. In diesem Prozess bemerkte ich ein Verhalten von verschiedenen Funktionen, die ich nicht verstehe. Die Funktion, die ich schreiben möchte, sollte die folgenden Eigenschaften haben:Übereinstimmender Vektor von Standardwerten mit match.arg() mit oder ohne Fehler [R]

  • es einen Vektor als Standardwert haben sollte (so kann der Benutzer sehen, welche Methoden verfügbar sind)
  • , wenn das Argument in der Standard bleibt Wert ist, dann wird die erste der beiden Methoden verwendet
  • wenn der Benutzer sollte manuell einen Vektor von Methoden liefert, dann sollte die Funktion einen Fehler geben

Grundsätzlich möchte ich die Funktion b ehave wie cor tut in R. Dort haben Sie einen Standardwert method = c("pearson", "kendall", "spearman"), und die Funktionen berechnet die Pearson-Korrelation, wenn method nicht angegeben ist. Wenn der Benutzer mehrere Methoden gleichzeitig anfordert, gibt die Funktion einen Fehler zurück.

Aus Blick auf cor scheint dies mit match.arg(method) getan. Dieses Verhalten wird hier dargestellt:

x <- y <- 1:5 

cor(x, y, method="pearson") 
# = 1 
cor(x, y, method="kendall") 
# = 1 
cor(x, y, method=c("pearson","kendall")) 
# gives an error 

Ich habe versucht, meine eigene Funktion zu schreiben, auch match.arg(method), aber ich erkennen, dass das Ergebnis irgendwie anders ist. Auch bei Auswahl eines Vektors für method endet die Funktion nicht mit einem Fehler, sondern gibt die Ergebnisse der ersten Methode zurück.

Dies wird hier dargestellt:

myfun <- function(x, method=c("add","multiply")){ 
    method <- match.arg(method) 
    if(method=="add") return(sum(x)) 
    if(method=="multiply") return(prod(x)) 
} 

x <- 1:5 

myfun(x, method="add") 
# = 15 
myfun(x, method="multiply") 
# = 120 
myfun(x, method=c("add","multiply")) 
# = 15 

ich dieses Verhalten nicht verstehen, und ich würde mich freuen, wenn Sie mir hier helfen könnte. Von meinen Versuchen auf Google erkenne ich, dass es möglicherweise mit nicht standardmäßigen Bewertungen zusammenhängt, aber ich kann noch nicht zwei und zwei zusammensetzen.

Vielen Dank im Voraus, Ihre Hilfe wird sehr geschätzt!

Prost!

EDIT:

ich konnte auch wieder Satz meine Frage:

Welche leistungsstarke Zauberei hat cor tun, dass es die Pearson-Korrelation zurückgibt, wenn method nicht geliefert wird, sondern dass es einen Fehler zurück, wenn method = c("pearson", "kendall", "spearman") ist explizit angegeben?

Antwort

6

Wenn choices und args in match.arg identisch sind, wird das erste Element zurückgegeben. Ansonsten hat arg lang sein 1. match.arg:

Da Standardargument Matching arg zu Entscheidungen gesetzt werden, dies als eine Ausnahme von der ‚Länge ein, es sei denn several.ok ist TRUE‘ erlaubt ist Regel, und gibt die erstes Element.

match.arg(c("pearson", "kendall", "spearman"), c("pearson", "kendall", "spearman")) 
## [1] "pearson" 
match.arg(c("pearson", "kendall"), c("pearson", "kendall", "spearman")) 
## Error in match.arg(c("pearson", "kendall"), c("pearson", "kendall", "spearman")) : 
## 'arg' must be of length 1 

Sie können Ihr gewünschtes Verhalten mit einem Dummy-Argumente bekommen:

myfun <- function(x, method=c("add","multiply","other.return.error")){ 
    method <- match.arg(method) 
    if("other.return.error" %in% method) stop("this option should not be used") 
    if(method=="add") return(sum(x)) 
    if(method=="multiply") return(prod(x)) 
} 
+0

Ich verstehe Sie richtig, dass das Verhalten von 'cor' und' myfun' sich unterscheidet, weil ich für einen Vektor mit zwei Elementen getestet habe, wobei 'cor' einen Fehler zurückgibt, weil das Standardargument die Länge 3 und' myfun' hat läuft ohne Fehler, weil sein Standardargument die Länge 2 hat? – SimonG

+0

Das "gewünschte" Verhalten war eigentlich nicht Teil der Frage. Ich habe das selbst gelöst, indem ich einfach überprüft habe, ob "method" mit "missing (method)" geliefert wird und einen Fehler mit "stop" ausgibt, wenn es mit der Länge> 1 geliefert wurde. Auf diese Weise brauche ich kein Dummy-Argument zeige auch in Manpages. – SimonG

+0

Ja, das Verhalten von 'cor' und' myfun' unterscheidet sich aufgrund der Länge der Standardargumente. Und ich verstehe, dass das gewünschte Verhalten nicht Teil der Frage war. Ich habe eine Lösung hinzugefügt, die nicht unbedingt für Sie, aber für andere Leute, die diese Frage finden können und noch keine befriedigende Lösung gefunden haben. – shadow

1

Die wichtigste Frage beantwortet wurde von @shadow (siehe oben).

Eine andere Möglichkeit, das gewünschte Verhalten für myfun bekommen ist, eine Prüfung durchzuführen, wenn method zugeführt wird oder nicht, und das Drucken einen Fehler, wenn es explizit mit mehr als einem Element geliefert wird.

myfun <- function(x, method=c("add","multiply")){ 
    if(!missing(method) & length(method)>1) stop("Only one 'method' allowed.") 
    method <- match.arg(method) 
    if(method=="add") return(sum(x)) 
    if(method=="multiply") return(prod(x)) 
} 

x <- 1:5 

myfun(x) 
# = 15 
myfun(x, method="add") 
# = 15 
myfun(x, method="multiply") 
# = 120 
myfun(x, method=c("add","multiply")) 
# gives error 

Dies umgeht die Ausnahme in match.arg von @shadow darauf hingewiesen, durch die ein Vektor für die Funktion liefert kann nicht Ursache ist ein Fehler. Stattdessen wird dieser Fehler sofort angezeigt.

Verwandte Themen