2012-07-19 6 views
38

Ich suchte nach einer Referenz, um über Ersatzfunktionen in R zu erfahren, aber ich habe noch keine gefunden. Ich versuche, das Konzept der Austauschfunktionen in R. ich den Code müssen verstehen unten, aber ich verstehe es nicht:Was sind Ersatzfunktionen in R?

"cutoff<-" <- function(x, value){ 
x[x > value] <- Inf 
x 
} 

und dann rufen wir Cutoff mit:

cutoff(x) <- 65 

Could jemand erklären, was eine Ersatzfunktion in R ist?

+5

Dies ist ein vollkommen akzeptables Q für SO –

+2

mögliche Duplikate von ['Levels <-' (Welche Zauberei ist das?] (Http://stackoverflow.com/questions/10449366/levels-what-scorery-is-this) –

+0

Siehe ** Erweitern R.- John Chambers (2016) **: * Seite 73 bis 79 des Kapitels 5 * –

Antwort

42

Wenn Sie anrufen

cutoff(x) <- 65 

Sie sind in der Tat ruft

x <- "cutoff<-"(x = x, value = 65) 

Der Name der Funktion angegeben werden muss, da es eine syntaktisch gültig, aber Nicht-Standard-Name ist und der Parser würde interpretieren Sie als den Operator nicht als Teil des Funktionsnamens, wenn er nicht zitiert wurde.

"cutoff<-"() ist wie jede andere Funktion (wenn auch mit einem seltsamen Namen); es ändert sein Eingangsargument auf der Basis von value (in diesem Fall setzt es irgendeinen Wert in x größer als 65 auf Inf (unendlich)).

Die Magie ist wirklich getan werden, wenn Sie die Funktion wie diese

nennen
cutoff(x) <- 65 

weil R ist das Parsen und die verschiedenen Bits ziehen, um den realen Anruf oben gezeigt zu machen.

Mehr allgemein haben wir

FUN(obj) <- value 

R Funktion findet "FUN<-"() und den Anruf einrichtet von obj und value in "FUN<-"()und arrangiert für das Ergebnis der "FUN<-"() vorbei zurück zu obj zugeordnet werden soll, damit es nennt :

Eine nützliche Referenz für diese in Bildung ist die R Language Definition Section 3.4.4: Subset assignment; Die Diskussion ist ein wenig schräg, scheint aber die offizielle Referenz zu sein (Ersatzfunktionen werden nebenbei in der R FAQ (Unterschiede zwischen R und S-PLUS) erwähnt, und in der R Sprachreferenz (verschiedene technische Probleme), aber ich habe keine weitere Diskussion in der offiziellen Dokumentation gefunden).

+0

sehr sehr hilfreiche Antwort ... Vielen Dank – Sam

9

Gavin bietet eine ausgezeichnete Diskussion über die Interpretation der Ersatzfunktion. Ich wollte Ihnen eine Referenz geben, da Sie auch danach gefragt haben: R Language Definition Section 3.4.4: Subset assignment.

+0

Ich schätze es Brian. – Sam

+5

nützlich, aber link-only answer ... Ich bearbeite @ GavinSimpson's Antwort, um es hinzuzufügen ... –

2

Denken Sie daran, in R ist alles Operation ein Funktionsaufruf (daher auch die Zuweisung Operationen) und alles, was existiert, ist ein Objekt. Ersatzfunktionen wirken, als ob sie ihre Argumente anstelle wie modifizieren in

colnames(d) <- c("Input", "Output") 

Sie haben die Kennung <- am Ende ihres Namens und zurück eine modifizierte Kopie des Arguments-Objekt (nicht-primitive Ersatzfunktionen) oder das gleiche Objekt (primitive Ersatzfunktionen)

An der R Aufforderung arbeiten folgendes nicht:

> `second` <- function(x, value) { 
+ x[2] <- value 
+ x 
+ } 
> x <- 1:10 
> x 
[1] 1 2 3 4 5 6 7 8 9 10 
> second(x) <- 9 
Error in second(x) <- 9: couldn't find function "second<-" 

Wie Sie sehen können, R sucht die Umwelt nicht für 012.373.aber für second<-. So können das Gleiche tun, aber unter Verwendung eines solchen Funktionskennung statt:

> `second<-` <- function(x, value) { 
+ x[2] <- value 
+ x 
+ } 

Nun wird die Zuordnung in der zweiten Position des Vektors funktioniert:

> second(x) <- 9 
> x 
[1] 1 9 3 4 5 6 7 8 9 10 

ich auch ein einfaches Skript geschrieben aufzulisten alle Ersatzfunktionen im R-Basispaket, find it here.

+0

Schrieb einen Kommentar in Ihrem Blog bezüglich des Skripts, um alle Ersatzfunktionen herauszufiltern: "Vermissen Sie nicht diese Ersatzfunktionen, die haben die "' <-' "dazwischen? Wie zB' split <-. default' und 'split <-. data.frame'?" –

+0

@ManuelS Ich überprüfe: '> Split <- data.frame Fehler:. Objekt '.data.frame' nicht gefunden > Split <- default Fehler:. Objekt '.default' nicht gefunden >' – TMOTTM

+0

@ManuelS Hadley nicht schreiben etwas über solche benannten Funktionen in Advanced R. Haben Sie eine Referenz für die Funktionen, die Sie erwähnen? – TMOTTM