Hier ist mein Code:
x<-c(1,2)
x
names(x)<- c("bob","ed")
x$ed
Warum erhalte ich den folgenden Fehler?
Fehler in x $ ed: $ Operator ist für Atomvektoren ungültig
Hier ist mein Code:
x<-c(1,2)
x
names(x)<- c("bob","ed")
x$ed
Warum erhalte ich den folgenden Fehler?
Fehler in x $ ed: $ Operator ist für Atomvektoren ungültig
Antworten:
In der Hilfedatei zu $
(Siehe ?"$"
) können Sie lesen:
$ ist nur für rekursive Objekte gültig und wird nur im folgenden Abschnitt über rekursive Objekte erläutert.
Lassen Sie uns nun prüfen, ob x
es rekursiv ist
> is.recursive(x)
[1] FALSE
Ein rekursives Objekt hat eine listenartige Struktur. Ein Vektor ist nicht rekursiv, sondern ein atomares Objekt
> is.atomic(x)
[1] TRUE
Daher wird beim Anwenden $
auf einen Vektor (nicht rekursives Objekt) eine Fehlermeldung angezeigt. Verwenden Sie [
stattdessen:
> x["ed"]
ed
2
Sie können auch verwenden getElement
> getElement(x, "ed")
[1] 2
Der Grund, warum Sie diesen Fehler erhalten, ist, dass Sie eine haben vector
.
Wenn Sie den $
Operator verwenden möchten , müssen Sie ihn lediglich in a konvertieren data.frame
. Da Sie in diesem speziellen Fall jedoch nur eine Zeile haben, müssen Sie diese auch transponieren. sonst bob
und ed
Ihre Zeilennamen statt Spaltennamen werden , was ist das, was ich glaube , Sie wollen.
x <- c(1, 2)
x
names(x) <- c("bob", "ed")
x <- as.data.frame(t(x))
x$ed
[1] 2
x <- as.list(x)
.
Weil $
funktioniert nicht auf Atomvektoren. Verwenden Sie [
oder [[
stattdessen. Aus der Hilfedatei für $
:
Die Standardmethoden funktionieren für Atomvektoren, Matrizen / Arrays und für rekursive (listähnliche, siehe is.recursive) Objekte etwas anders. $ ist nur für rekursive Objekte gültig und wird nur im folgenden Abschnitt über rekursive Objekte erläutert.
x[["ed"]]
wird funktionieren.
Hier ist x ein Vektor. Sie müssen es in einen Datenrahmen konvertieren, um den Operator $ verwenden zu können.
x <- as.data.frame(x)
wird für dich arbeiten.
x<-c(1,2)
names(x)<- c("bob","ed")
x <- as.data.frame(x)
gibt Ihnen die Ausgabe von x als:
bob 1
ed 2
Und gibt Ihnen die Ausgabe von x $ ed als:
NULL
Wenn Sie bob und ed als Spaltennamen möchten, müssen Sie den Datenrahmen wie folgt transponieren, damitx <- as.data.frame(t(x))
Ihr Code wird
x<-c(1,2)
x
names(x)<- c("bob","ed")
x$ed
x <- as.data.frame(t(x))
Die Ausgabe von x $ ed lautet nun:
[1] 2
Sie erhalten diesen Fehler, obwohl alles in Einklang steht, aufgrund eines Konflikts, der durch eines der Pakete verursacht wird, die derzeit in Ihrer R-Umgebung geladen sind.
Um dieses Problem zu beheben, trennen Sie alle nicht benötigten Pakete von der R-Umgebung. Wenn ich zum Beispiel das gleiche Problem hatte, habe ich Folgendes getan:
detach(package:neuralnet)
Fazit: Trennen Sie alle Bibliotheken, die für die Ausführung nicht mehr benötigt werden ... und das Problem wird gelöst.
Atomic Sammlungen sind zugänglich durch $
Rekursive Sammlungen gibt es nicht. Vielmehr [[ ]]
wird das verwendet
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 kann manchmal lustig sein
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
Error in object$y : $ operator is invalid for atomic vectors
gestoßen, dass ich versucht habe, Ihre Antwort / Ihren Vorschlag durchzuarbeiten, und mein Problem nicht gelöst habe. Vielleicht verstehe ich Ihre erste Antwort nicht. Könnten Sie bitte versuchen, Ihre Antwort anhand eines vollständigeren Beispiels neu zu formulieren?