2016-02-01 19 views
8

Widziałem kilka osób korzystających [<- jako funkcję z polskiej notacji npJak działa funkcja `[<-` w R?

x <- matrix(1:4, nrow = 2) 
`[<-`(x, 1, 2, 7) 

która zwraca

 [,1] [,2] 
[1,] 1 7 
[2,] 2 4 

próbowałam zabawy z [<- trochę, i to wygląda na to, że używa go w ten sposób, drukuje wynik czegoś w rodzaju x[1,2] <- 7 bez faktycznego wykonywania przypisania. Ale nie mogę się dowiedzieć, na pewno, co ta funkcja faktycznie robi, ponieważ dokumentacja podana dla ?"[" wspomina o tym jedynie i nie mogę wyszukiwać google ani SO dla "[< -".

I tak, wiem, że faktycznie użyciu prawdopodobnie jest to straszny pomysł, jestem po prostu ciekawy ze względu na lepsze zrozumienie R.

+2

To jest bardziej jak R przekształca 'x [1,2] <- 7' na' x <- '[<-' (x, 1, 2, 7) '. – joran

+0

Jeśli rozumiesz funkcję '[' i funkcja '<-', to funkcja' [<-' ma wiele sensu. Spróbuj '[(x, 1,2)'. Spróbuj '<- (a, 1)' –

+2

Nie widzę tego duplikatu. Zastanawiam się, dlaczego '[<-' nie wpływa w rzeczywistości na pod-przydział w symbolu/nazwanym obiekcie' x'. Wydaje się, że nie było to pytanie zadane w nominowanym duplikacie. –

Odpowiedz

4

To jest to, co trzeba zrobić, aby uzyskać przypisanie trzymać:

`<-`( `[`( x, 1, 2), 7) # or x <- `[<-`( x, 1, 2, 7) 
x 
    [,1] [,2] 
[1,] 1 7 
[2,] 2 4 

Zasadniczo to, co się dzieje jest to, że [ jest tworzenie wskaźnik do lokalizacji wiersz cOL z x a następnie <- (co jest naprawdę synonimem assign, które mogą być również wykorzystywane w notacji Infix) jest doin g faktyczne "stałe" zadanie. Nie daj się zwieść myśleniu, że jest to zadanie typu "zadzwonić za referencją". Jestem pewien, że nadal będzie utworzona tymczasowa wartość x.

Twoja wersja dokonała przeniesienia (jak widać po tym, co zostało zwrócone), ale to przypisanie było tylko w lokalnym środowisku połączenia z [<-, które nie obejmowało środowiska globalnego.

+0

Czy 'x [1,2] <- 7' jest wywołanie po odesłaniu? – fishtank

+0

Nie.To również stworzy tymczasową wartość. Większość "zwykłych" przypisań R to wywołanie przez obietnicę, która jest bardziej podobna do wartości przywoławczej niż wywołanie przez odniesienie. Pakiet 'data.table' dokonuje modyfikacji jego obiektów w miejscu. Mechanizm R6 został skonfigurowany w celu zapewnienia bardziej bezpośredniego dostępu do obiektów i zapobiegania obciążeniu kopiowaniem. –

2

Od `[`(x, y) dzieli obiekt, a `<-`(x, z) wykonuje przypisanie, wygląda na to, że `[<-`(x,y,z) wykonałby zadanie . Odpowiedź @ 42-s jest doskonałym wyjaśnieniem tego, co faktycznie robi, a najlepsza odpowiedź na `levels<-`(What sorcery is this? daje pewien wgląd w to, dlaczego R działa w ten sposób.

Aby zobaczyć, co faktycznie robi [<- pod maską, trzeba przejść do kodu źródłowego C, który dla [<- można znaleźć na http://svn.r-project.org/R/trunk/src/main/subassign.c (odpowiednie części zaczynają się od około 1470 linii). Widać, że x, obiekt "przypisany do" jest chroniony, tak że zmutowana jest tylko wersja lokalna. Zamiast tego używamy VectorAssign, MatrixAssign, ArrayAssign, itp., Aby wykonać zadanie lokalnie, a następnie zwracając wynik.