Funktion '[-' wird _ ein Element ersetzen, aber kein _element_ anhängen

8

Bei Verwendung von '[<-' ist mir Folgendes aufgefallen. Ich bin erfolgreich bei Ersetzen von Elementen, aber nicht beim Anhängen eines Elements an den Vektor.

Beispiel:

%Vor%

Wenn jedoch bereits ein Wert im Index vorhanden ist, wird der Wert ersetzt.

%Vor%

Habe ich einfach die Syntax falsch, oder ist das so? Jeder weitere Einblick in Was hier vor sich geht, würde geschätzt werden.

Bitte beachten Sie, dass es hier kein konkretes Ziel gibt, außer um die Sprache besser zu verstehen.

Aktualisieren Sie die Kommentare von @Roland und @Dason.

Offenbar hängt das Verhalten davon ab, wie die Werte des Objekts ursprünglich zugewiesen werden. Wenn der VarX zugewiesene Wert beispielsweise 1:2 gegenüber c(1, 2) ist, ergibt das Verhalten von [& lt; - (VarX, 2, 22) unterschiedliche Ergebnisse, wie unten dargestellt:

### Änderungen werden nicht in VarX gespeichert

%Vor%

### Änderungen werden in VarX gespeichert

%Vor%

%Vor%     
Ricardo Saporta 02.03.2013, 19:32
quelle

1 Antwort

11

Die Funktion '[<-' ersetzt in ihrem ersten Argument möglicherweise nichts. Unter bestimmten Umständen erstellt es eine Kopie des Objekts und ändert das.

Siehe Abschnitt 3.4.4 der Sprachdefinition:

%Vor%

Dies wird im Wesentlichen ausgeführt, wenn die Struktur von x geändert werden muss. Aus Experimenten des OP (und anderer, einschließlich mir selbst) wird jedoch klar, dass die "[<-" -Funktion Elemente an Ort und Stelle modifizieren kann. Es ist klar, dass nichts direkt durchgeführt werden kann, wenn das gesamte Objekt ersetzt wird.

In-Place-Substitution:

%Vor%

Ersetzen des gesamten Objekts, weil der Typ geändert wurde (in C function SubAssignTypeFix ):

%Vor%

Eine andere Situation, in der das Objekt ersetzt wird, ist, wenn mehr als eine Referenz auf das Objekt existiert, das modifiziert wird:

%Vor%

Das Ausführen von R unter dem Debugger zeigt, dass die indirekt über x[2] <- 99 aufgerufene Zuordnungsfunktion C function do_set aufruft, während diese Funktion nicht aufgerufen wird, wenn die Zuweisungsfunktion direkt über den Namen aufgerufen wird.

do_set ruft eine Funktion defineVar auf, die die entsprechende Umgebung ändert. Im Falle einer Inplace-Ersetzung ersetzt sich das Objekt in der Umgebung. Dies sind genau die Fälle, in denen der Aufruf der Zuweisungsfunktion nach Name dazu führt, dass das Objekt geändert wird (eine Kopie wurde nicht erstellt).

Interessanter Leckerbissen (und siehe hier: R-Objektidentität )

%Vor%

Um die ursprüngliche Frage direkt zu beantworten, wenn [<- den Vektor vergrößert, wird eine Kopie erstellt. Von der Funktion EnlargeVector at subassign.c:113 :

%Vor%

Dies ist R 2.15.2, die ich aus der Quelle ohne Optimierung und mit Debug-Informationen erstellt habe. Es ist sehr langsam ohne Optimierung.

    
Matthew Lundberg 02.03.2013, 20:24
quelle

Tags und Links