Wie funktioniert die '- Funktion in R?

8

Ich habe ein paar Leute gesehen, die [<- als Funktion mit polnischer Schreibweise verwenden, zum Beispiel

%Vor%

was zurückgibt

%Vor%

Ich habe versucht, mit [<- ein wenig herumzuspielen, und es sieht so aus, als würde man das Ergebnis von etwas wie x[1,2] <- 7 ausgeben, ohne die Zuweisung tatsächlich auszuführen. Aber ich kann nicht sicher herausfinden, was diese Funktion tatsächlich macht, weil die Dokumentation für ?"[" nur beiläufig erwähnt, und ich kann Google oder SO nicht nach "[& lt; -".

suchen

Und ja, ich weiß, dass mit es wahrscheinlich eine schreckliche Idee ist, ich bin nur neugierig auf ein besseres Verständnis von R.

    
Empiromancer 01.02.2016, 20:15
quelle

2 Antworten

4

Dies ist, was Sie tun müssen, um die Aufgabe zu erhalten:

%Vor%

Im Wesentlichen ist es so, dass [ einen Zeiger auf die Zeilenposition von x und dann <- erzeugt (was wirklich ein Synonym für assign ist, das auch in einer Infix-Notation verwendet werden kann). macht die eigentliche "permanente" Aufgabe. Lassen Sie sich nicht irreführen, dass dies eine Call-by-Reference-Zuweisung ist. Ich bin mir ziemlich sicher, dass immer noch ein temporärer Wert von x erstellt wird.

Ihre Version hat eine Unterzuordnung vorgenommen (wie man sieht, wenn sie zurückgegeben wird), aber diese Zuweisung erfolgte nur in der lokalen Umgebung des Aufrufs von [<- , die die globale Umgebung nicht umfasste.

    
42- 01.02.2016, 21:03
quelle
2

Da '['(x, y) ein Objekt schneidet und '<-'(x, z) eine Zuweisung durchführt, scheint '[<-'(x,y,z) die Zuweisung x[y] <- y auszuführen. @ 42-Antwort ist eine großartige Erklärung dessen, was [<- tatsächlich tut, und die beste Antwort auf 'levels & lt; -' (Welche Zauberei ist das? gibt einen Einblick, warum R auf diese Weise funktioniert.

Um zu sehen, was [<- tatsächlich unter der Haube tut, müssen Sie zum C-Quellcode gehen, den Sie für [<- unter Ссылка (die relevanten Teile beginnen um die Linie 1470). Sie können sehen, dass x , das Objekt, dem "zugewiesen" ist, geschützt ist, so dass nur die lokale Version mutiert ist. Stattdessen verwenden wir VectorAssign, MatrixAssign, ArrayAssign usw., um die Zuweisung lokal durchzuführen und dann das Ergebnis zurückzugeben.

    
Empiromancer 01.02.2016 23:28
quelle

Tags und Links