Hier is mijn code:
x<-c(1,2)
x
names(x)<- c("bob","ed")
x$ed
Waarom krijg ik de volgende foutmelding?
Fout in x$ed: $ operator is ongeldig voor atomaire vectoren
Antwoord 1, autoriteit 100%
Uit het helpbestand over $
(Zie ?"$"
) kun je lezen:
$ is alleen geldig voor recursieve objecten en wordt alleen besproken in het onderstaande gedeelte over recursieve objecten.
Laten we nu eens kijken of x
recursief is
> is.recursive(x)
[1] FALSE
Een recursief object heeft een lijstachtige structuur. Een vector is niet recursief, het is in plaats daarvan een atomair object, laten we eens kijken
> is.atomic(x)
[1] TRUE
Daarom krijg je een foutmelding bij het toepassen van $
op een vector (niet-recursief object), gebruik in plaats daarvan [
:
> x["ed"]
ed
2
U kunt ook getElement
. gebruiken
> getElement(x, "ed")
[1] 2
Antwoord 2, autoriteit 39%
De reden dat je deze foutmelding krijgt is dat je een vector
hebt.
Als u de operator $
wilt gebruiken, hoeft u deze alleen maar te converteren naar een data.frame
. Maar aangezien je in dit specifieke geval maar één rij hebt, zou je deze ook moeten transponeren; anders worden bob
en ed
je rijnamen in plaats van je kolomnamen, wat ik denk dat je wilt.
x <- c(1, 2)
x
names(x) <- c("bob", "ed")
x <- as.data.frame(t(x))
x$ed
[1] 2
Antwoord 3, autoriteit 12%
Omdat $
niet werkt op atomaire vectoren. Gebruik in plaats daarvan [
of [[
]. Uit het helpbestand voor $
:
De standaardmethoden werken iets anders voor atomaire vectoren, matrices/arrays en voor recursieve (lijstachtige, zie is.recursive) objecten. $ is alleen geldig voor recursieve objecten en wordt alleen besproken in de sectie hieronder over recursieve objecten.
x[["ed"]]
zal werken.
Antwoord 4, autoriteit 4%
Hier is x een vector.
U moet het converteren naar een dataframe om de $ operator te gebruiken.
x <- as.data.frame(x)
zal voor u werken.
x<-c(1,2)
names(x)<- c("bob","ed")
x <- as.data.frame(x)
geeft u uitvoer van x als:
bob 1
ed 2
En, je krijgt een output van x$ed als:
NULL
Als u bob en ed als kolomnamen wilt, moet u het dataframe transponeren zoals x <- as.data.frame(t(x))
Dus je code wordt
x<-c(1,2)
x
names(x)<- c("bob","ed")
x$ed
x <- as.data.frame(t(x))
De output van x$ed is nu:
[1] 2
Antwoord 5
Je krijgt deze foutmelding, ondanks dat alles in lijn is, vanwege een conflict veroorzaakt door een van de pakketten die momenteel in je R-omgeving zijn geladen.
Dus, om dit probleem op te lossen, ontkoppel alle pakketten die niet nodig zijn van de R-omgeving. Toen ik bijvoorbeeld hetzelfde probleem had, deed ik het volgende:
detach(package:neuralnet)
bottom line: ontkoppel alle bibliotheken die niet langer nodig zijn voor uitvoering… en het probleem zal worden opgelost.
Antwoord 6
Deze oplossing werkte voor mij
data<- transform(data, ColonName =as.integer(ColonName))
Antwoord 7
Atomic-collecties zijn toegankelijk via $
Recursieve verzamelingen zijn dat niet. In plaats daarvan wordt de [[ ]]
gebruikt
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 kan soms grappig zijn
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