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
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
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
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.
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
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
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ć. –
byłoby łatwiejsze w użyciu 'x <- as.list (x)'. –
tak dla 1 pozycji jako .lista byłaby lepsza. Nigdy nie używam list, więc zawsze o nich zapominam. – Dalupus