R Fehler in x $ ed: $ Operator ist für Atomvektoren ungültig


74

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:


97

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 xes 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

1
Ich bin auf den gleichen Fehler Error in object$y : $ operator is invalid for atomic vectorsgestoß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?
Schätzen Sie

@oaxacamatt Meine Antwort bezieht sich auf data.frames oder Listen, die rekursive Objekte sind. Sie verwenden einen Vektor und deshalb hilft Ihnen meine Antwort nicht weiter. Sie liegen falsch und meine Antwort ist richtig, dann ist Ihre Ablehnung ungültig.
Jilber Urbina

41

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 bobund edIhre 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

5
Es wäre einfacher zu bedienen x <- as.list(x).
Ben Bolker

ja für 1 artikel as.list wäre besser. Ich benutze niemals Listen, deshalb vergesse ich sie immer.
Dalupus

13

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.


4

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


1

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.


-2

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

4
Ich denke du hast das rückwärts. LIsts sind rekursive Objekte und können über $ aufgerufen werden, numerische Vektoren sind atomar und können nicht. Ich bin mir nicht sicher, was Sie hier zeigen wollen.
Ben Bolker
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.