Operator "[-" in RStudio und R

36

Zufällig bin ich auf seltsames Verhalten von "[<-" operator gestoßen. Es verhält sich unterschiedlich je nach Reihenfolge der Anrufe und ob ich RStudio oder nur gewöhnliche RGui verwende. Ich werde mich an einem Beispiel verdeutlichen.

%Vor%

Soweit ich weiß, sollte die erste Zuweisung nicht ändern x (oder vielleicht bin ich falsch?), während die zweite tun sollte. Und tatsächlich ist das Ergebnis der obigen Operationen

%Vor%

Wenn wir diese Operationen jedoch in unterschiedlicher Reihenfolge durchführen, sind die Ergebnisse unterschiedlich und x hat sich geändert! Sinnvoll:

%Vor%

Aber es passiert nur, wenn ich plain R benutze! In RStudio ist das Verhalten in beiden Optionen identisch. Ich habe es auf zwei Rechnern (eines mit Fedora eins mit Win7) überprüft und die Situation sieht genau gleich aus. Ich weiß, dass die 'funktionale' Version ( "[<-"(x..) ) wahrscheinlich nie benutzt wird, aber ich bin sehr neugierig, warum es passiert. Könnte das jemand erklären?

=========================

BEARBEITEN: Ok, also aus Kommentaren bekomme ich, dass x <- 1:10 den Typ 'integer' hat und nach dem Ersetzen von x[5] <- 123 'double' ist. Bleibt aber die Frage, warum sich das Verhalten in RStudio unterscheidet? Ich starte R Sitzung neu und es ändert nichts.

    
BartekCh 21.03.2013, 22:26
quelle

1 Antwort

32

RStudios Verhalten

Der Objektbrowser von Rstudio ändert Objekte, die untersucht werden, so, dass das Kopieren bei Änderungen erzwungen wird. Insbesondere verwendet der Objektbrowser mindestens eine R-Funktion, deren Aufruf intern die Bewertung des Objekts erzwingt und dabei den Wert des benannten -Feldes des Objekts von 1 auf 2 zurücksetzt. Von R-Internals Handbuch :

  

Wenn ein Objekt geändert werden soll, wird das benannte Feld konsultiert. Ein Wert von 2 bedeutet, dass das Objekt vor der Änderung dupliziert werden muss. [...] Ein Wert von 1 wird für Situationen verwendet, in denen [...] im Prinzip zwei Kopien eines für die Dauer der Berechnung existieren, [...] aber nicht länger, und somit einige primitive Funktionen optimiert werden können um in diesem Fall eine Kopie zu vermeiden.

Um zu sehen, dass der Objektbrowser das benannte -Feld ( [NAM()] im nächsten Codeblock) ändert, vergleichen Sie die Ergebnisse der Ausführung der folgenden Zeilen. In der ersten werden beide "Zeilen" zusammen ausgeführt, so dass Rstudio keine Zeit hat, X zu "berühren", bevor seine Struktur abgefragt wird. In der zweiten wird jede Zeile separat eingefügt, also wird X vor der Überprüfung modifiziert.

%Vor%

Wenn das benannte -Feld auf 2 gesetzt ist, ändert [<-(X, ...) das ursprüngliche Objekt nicht. Das folgende Einfügen von Rstudio in alle gleichzeitig ändert X , während das Einfügen in Zeile für Zeile nicht funktioniert:

%Vor%

Eine weitere Konsequenz aus all dem ist, dass der Objektbrowser von Rstudio einige Operationen langsamer macht, als sie es sonst tun würden. Vergleichen Sie wieder die gleichen beiden Befehle, die zuerst zusammen eingefügt wurden, und dann nacheinander:

%Vor%

Variablenverhalten von [& lt; - in R

Das Verhalten von [<- w.r.t. Das Ändern eines Vektors X hängt von den Speicherarten von X und von dem Element ab, das ihm zugewiesen wird. Dies erklärt das Verhalten von R , nicht jedoch das von Rstudio.

In R, wenn [<- entweder an einen Vektor X hängt oder eine Unterzuordnung ausführt, die erfordert, dass der X -Typ geändert wird, X wird kopiert und der zurückgegebene Wert überschreibt nicht die Vorhandene Variable X . (Dazu müssen Sie etwas wie X <- "[<-(X, 2, 100) tun.

Daher ändert keines der folgenden Elemente X

%Vor%

Wenn möglich, erlaubt R der Funktion [<- jedoch, X direkt durch Referenz zu ändern (d. h. ohne eine Kopie zu erstellen). "Möglich" sind Fälle, in denen eine Unterzuordnung nicht erfordert, dass der Typ X geändert wird.

So ändern alle folgenden X

%Vor%     
Josh O'Brien 21.03.2013, 23:17
quelle

Tags und Links