2013-08-29 8 views
6

Kiedy czytam podręcznik R, natknąłem się kilka linii kodu jak poniżej (skopiowany z podręcznika dla 'colSums R'):co to ma znaczyć "x [] <- as.integer (x)"

x <- cbind(x1 = 3, x2 = c(4:1, 2:5)) 
dimnames(x)[[1]] <- letters[1:8] 
x[] <- as.integer(x) 

Czy ktoś mógłby mi powiedzieć, jaki jest cel ostatniej linii? Dzięki!

+2

Porównaj wyniki normalnym przypisania vs. przypisanie do 'x []' jako więc. Porównaj: 'x [] <- as.integer (x); x; 'to' x <- as.integer (x); x; ' – thelatemail

Odpowiedz

10

moim rozumieniu jest to, że przypisanie do x[] (lub przypisanie do obiektu z nawiasach kwadratowych, bez wartości - dla tych, którzy szukają tego problemu) nadpisuje wartości w x, zachowując attributes że x może mieć, w tym wymiarów macierzy . W tym przypadku warto pamiętać, że matryca jest po prostu wektorem z dodanymi wymiarami.

Więc biorąc pod uwagę ...

x <- cbind(x1 = 3, x2 = c(4:1, 2:5)) 
dimnames(x)[[1]] <- letters[1:8] 

attributes(x) 
#$dim 
#[1] 8 2 
# 
#$dimnames 
#$dimnames[[1]] 
#[1] "a" "b" "c" "d" "e" "f" "g" "h" 
# 
#$dimnames[[2]] 
#[1] "x1" "x2" 

... to zachowa wymiary i imiona zapisane jako atrybuty w x

x[] <- as.integer(x) 

Chociaż nie będzie ...

x <- as.integer(x) 

Ta sama logika dotyczy również wektorów:

x <- 1:10 
attr(x,"blah") <- "some attribute" 

attributes(x) 
#$blah 
#[1] "some attribute" 

Więc ta zachowuje wszystkie swoje piękne atrybuty:

x[] <- 2:11 
x 
# [1] 2 3 4 5 6 7 8 9 10 11 
#attr(,"blah") 
#[1] "some attribute" 

niniejsza nie będzie:

x <- 2:11 
x 
#[1] 2 3 4 5 6 7 8 9 10 11 
+1

ponieważ' [<-' i '<-' są różnymi funkcjami ... – mnel

+0

Rozumiem. Dziękuję Ci bardzo. Twoja odpowiedź jest szczegółowa i pomocna. –

+0

Chociaż, gdy masz ciągi znaków, nie są one konwertowane na liczby całkowite. Czemu? Na przykład. x <- cind (x1 = as.character (3), x2 = as.character (c (4: 1, 2: 5))); x [] <- is.integer (x) – vitor

1
x[] <- as.integer(x) 

Parsuje zawartość matrix x na liczbę całkowitą, a następnie przechowuje ją z powrotem do x, jako macierz.

x[,] <- as.integer(x) 

również działa. Ale utrata struktury macierzy będzie tracona.

Powiązane problemy