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?
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
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
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