2014-04-25 8 views
36

Oto mój kod:

x<-c(1,2) 
x 
names(x)<- c("bob","ed") 
x$ed 

Dlaczego pojawia się błąd:

Error in x$ed : $ operator is invalid for atomic vectors 

Odpowiedz

51

Z pliku pomocy o $ (Zobacz ?"$") można przeczytać:

$ is only valid for recursive objects, and is only discussed in the section below on recursive objects.

teraz sprawdźmy czy x jest rec ursive

> is.recursive(x) 
[1] FALSE 

Obiekt rekursywny ma strukturę podobną do listy. Wektor nie jest rekurencyjny, że jest to obiekt atomowy zamiast, powiedzmy sprawdzić

> is.atomic(x) 
[1] TRUE 

Dlatego pojawi się błąd przy stosowaniu $ do wektora (nierekursywnych obiektu), użyj [ zamiast:

> x["ed"] 
ed 
2 

można również użyć getElement

> getElement(x, "ed") 
[1] 2 
8

Ponieważ $ nie działa na wektorach atomowych. Zamiast tego użyj [ lub [[. Z pliku pomocy dla $:

The default methods work somewhat differently for atomic vectors, matrices/arrays and for recursive (list-like, see is.recursive) objects. $ is only valid for recursive objects, and is only discussed in the section below on recursive objects.

x[["ed"]] zadziała.

25

Powodem, dla którego otrzymujesz ten błąd jest to, że masz vector.

Jeśli chcesz użyć operatora $, po prostu musisz go przekonwertować na data.frame. Ale ponieważ w tym konkretnym przypadku masz tylko jeden wiersz, musisz go również przetransponować; w przeciwnym razie bob i ed staną się nazwami twoich wierszy zamiast nazw kolumn, co jest tym, co myślę, że chcesz.

x <- c(1, 2) 
x 
names(x) <- c("bob", "ed") 
x <- as.data.frame(t(x)) 
x$ed 
[1] 2 
+3

byłoby łatwiejsze w użyciu 'x <- as.list (x)'. –

+0

tak dla 1 pozycji jako .lista byłaby lepsza. Nigdy nie używam list, więc zawsze o nich zapominam. – Dalupus

1

kolekcje atomowe są w stanie dostępu przez $

zbiory rekurencyjne nie są. Raczej [[]] jest użytkiem. . .

Browse[1]> is.atomic(list()) 
[1] FALSE 

Browse[1]> is.atomic(data.frame()) 
[1] FALSE 

Browse[1]> is.atomic(class(list(foo="bar"))) 
[1] TRUE 

Browse[1]> is.atomic(c(" lang ")) 
[1] TRUE 

R może być zabawne czasami

a = list(1,2,3) 
b = data.frame(a) 
d = rbind("?",c(b)) 
e = exp(1) 
f = list(d) 
print(data.frame(c(list(f,e)))) 

... \

X1 X2 X3 X2.71828182845905 
1 ? ? ?   2.718282 
2 1 2 3   2.718282 
+1

Myślę, że masz to do tyłu. Obiekty LIst są obiektami rekursywnymi i można do nich uzyskać dostęp za pośrednictwem $, wektory liczbowe są atomowe i nie mogą. Nie jestem pewien, co próbujesz tutaj pokazać. –

Powiązane problemy