R bietet zwei verschiedene Methoden für den Zugriff auf die Elemente einer Liste oder eines data.Rahmen - die []
und [[]]
Betreiber.
Was ist der Unterschied zwischen den beiden? In welchen Situationen sollte ich einen über den anderen?
InformationsquelleAutor der Frage Sharpie | 2009-07-23
R Language Definition ist nützlich für die Beantwortung dieser Art von Fragen:
InformationsquelleAutor der Antwort ars
Die signifikanten Unterschiede zwischen den beiden Methoden sind in die Klasse der Objekte, auf die Sie zurückkehren, wenn Sie für die Extraktion und ob Sie akzeptieren können, eine Reihe von Werten, oder nur ein einzelner Wert bei der Zuweisung.
Berücksichtigen Sie bei der Daten-Extraktion auf der folgenden Liste:
Sagen, wir möchten zum extrahieren der gespeicherten Wert von bool von foo und verwenden Sie es innerhalb einer
if()
- Anweisung. Dies veranschaulichen die Unterschiede zwischen die Rückgabewerte von[]
und[[]]
wenn Sie verwendet werden, um Daten zu extrahieren. Die[]
- Methode gibt Objekte der Klasse Liste (oder Daten.frame, wenn foo war ein Daten.frame), während der[[]]
- Methode gibt Objekte, deren Klasse wird bestimmt durch den Typ Ihrer Werte.So, mit der
[]
Methode führt die folgenden:Dies ist, weil die
[]
Methode zurückgegeben wird eine Liste, und die Liste ist nicht gültig-Objekt übergeben, direkt in einif()
- Anweisung. In diesem Fall müssen wir mit[[]]
da wird es wieder das "Nackte" Objekt, gespeichert in 'bool', die über die entsprechende Klasse:Der zweite Unterschied ist, dass die
[]
operator kann verwendet werden, um den Zugriff auf eine Bereich von slots in einer Liste oder der Spalten in einem data frame, während die[[]]
operator ist beschränkt auf den Zugriff auf eine single Schlitz oder Spalte. Betrachten wir den Fall von Wert-Zuweisung mit Hilfe einer zweiten Listebar()
:Sagen, wir wollen, überschreiben die letzten zwei slots foo mit den Angaben in bar. Wenn wir versuchen, die
[[]]
operator, dies ist, was passiert:Dies ist, weil
[[]]
beschränkt sich auf den Zugriff auf ein einzelnes element. Wir müssen[]
:Beachten Sie, dass die Zuordnung erfolgreich war, werden die slots in foo behielten Ihre ursprünglichen Namen.
InformationsquelleAutor der Antwort Sharpie
Doppelte Klammern greift auf eine Liste elementwährend eine einzelne Klammer gibt Ihnen eine Liste mit einem einzigen element.
InformationsquelleAutor der Antwort medriscoll
[]
extrahiert eine Liste[[]]
extrahiert Elemente innerhalb der ListeInformationsquelleAutor der Antwort
Nur hinzufügen, dass hier
[[
auch ausgestattet für rekursive Indizierung.Dies war angedeutet in der Antwort von @JijoMatthew aber nicht erforscht.
Wie bereits in
?"[["
syntax wiex[[y]]
wolength(y) > 1
interpretiert werden als:Beachten Sie, dass diese nicht ändern, was sollten die wichtigsten mitnehmen auf den Unterschied zwischen
[
und[[
-- nämlich, dass der ehemalige wird verwendet für subsettingund die letztere wird verwendet für extrahieren einzelnen Listen-Elemente.Beispielsweise
Erhalten den Wert 3, die wir tun können:
Zurück zu @JijoMatthew die Antwort von oben, erinnern
r
:Insbesondere, das erklärt die Fehler, die wir neigen dazu zu bekommen, wenn mis-mit
[[
nämlich:Da dieser code eigentlich versucht zu bewerten
r[[1]][[2]][[3]]
und die Verschachtelung derr
Stoppt bei Stufe eins, den Versuch zu extrahieren, die durch die rekursive Indizierung fehlgeschlagen bei[[2]]
d.h., auf der Ebene 2.Hier R war auf der Suche nach
r[["foo"]][["far"]]
die nicht vorhanden ist, so erhalten wir die subscript out of bounds error.Wäre es wahrscheinlich ein bisschen mehr hilfreich/konsistent, wenn diese beiden Fehler gab die gleiche Meldung.
InformationsquelleAutor der Antwort MichaelChirico
Beide sind Arten unterteilen.
Die einzige Halterung zurück, die eine Teilmenge der Liste, die in sich selbst eine Liste. dh:Es kann oder kann nicht enthalten, die mehr als ein Element.
Auf der anderen Seite einen doppelten Bügel und zurückkehren wird nur ein einzelnes element aus der Liste.
-Einzelne bracket wird uns eine Liste. Wir können auch eine einzige Klammer, wenn wir zurückkehren wollen mehrere Elemente aus der Liste.
betrachten Sie die folgende Liste:-
Nun bitte beachten Sie die Art der Liste wird zurückgegeben, wenn ich versuche, um es anzuzeigen.
Ich geben Sie r ein und drücken Sie die EINGABETASTE
Nun wir werden sehen, die Magie der einzigen Klammer:-
das ist genau das gleiche, wie wenn wir versucht, die Anzeige mit dem Wert von r auf dem Bildschirm, was bedeutet, dass die Verwendung einzelner Klammer hat wieder eine Liste, wo bei index 1 haben wir einen Vektor aus 10 Elementen, dann haben wir zwei weitere Elemente mit Namen foo und weit.
Wir dürfen auch Sie wählen, um einen einzelnen index oder element-Namen als Eingabe für die einzelne Klammer.
eg:
In diesem Beispiel Gaben wir einem index "1" ein und bekam eine Liste mit einem element(das ist ein array mit 10 zahlen)
Im Beispiel oben haben wir gab ein index "2" ein und bekam eine Liste mit einem element
In diesem Beispiel übergeben Sie den Namen eines Elements und im Gegenzug eine Liste zurückgegeben wurde mit einem element.
Man kann auch einen Vektor der element-Namen wie:-
In diesem Beispiel passierten wir einen Vektor mit zwei-element-Namen "foo" und "weit"
Im Gegenzug bekamen wir eine Liste mit zwei Elementen.
In kurze einzelne bracket wird immer wieder Sie eine weitere Liste mit der Anzahl der Elemente gleich der Anzahl der Elemente oder der Anzahl der Indizes, die Sie übergeben, in der eine einzige Halterung.
Im Gegensatz dazu, eine Doppel-Halterung wird immer wieder nur ein element.
Vor der Umstellung auf die doppelte Klammer ein Hinweis im Auge behalten werden.
NOTE:THE MAJOR DIFFERENCE BETWEEN THE TWO IS THAT SINGLE BRACKET RETURNS YOU A LIST WITH AS MANY ELEMENTS AS YOU WISH WHILE A DOUBLE BRACKET WILL NEVER RETURN A LIST. RATHER A DOUBLE BRACKET WILL RETURN ONLY A SINGLE ELEMENT FROM THE LIST.
Werde ich die Website ein paar Beispiele. Bitte halten Sie eine Notiz, die Worte in Fett-und kommen zurück, um es, nachdem Sie fertig sind mit den folgenden Beispielen:
Doppel-Halterung bringen Sie den tatsächlichen Wert im index.(Es wird NICHT zurückgeben einer Liste)
für Doppel-Klammern, wenn wir versuchen uns mehr als ein Element, indem ein Vektor wird zu einem Fehler führen, nur weil es wurde nicht gebaut, um gerecht zu werden, müssen, aber nur, um ein einzelnes element zurückgeben.
Betrachten Sie die folgenden
InformationsquelleAutor der Antwort Jijo Mathew
Von Hadley Wickham:
Mein (scheiß sucht) Modifikation zeigen, mit tidyverse /purrr:
InformationsquelleAutor der Antwort jzadra
Um zu helfen Neulinge navigieren Sie durch die manuelle Nebel, es könnte hilfreich sein, um zu sehen, die
[[ ... ]]
notation als einstürzenden Funktion - in anderen Worten, es ist, wenn Sie nur wollen, um die 'Daten' von einer benannten Vektor, Liste oder Datenrahmen. Es ist gut, dies zu tun, wenn Sie Daten verwenden möchten, die von diesen Objekten für die Berechnungen. Diese einfachen Beispiele verdeutlichen.Also aus dem Dritten Beispiel:
InformationsquelleAutor der Antwort Redfoot
Für einen weiteren konkreten Anwendungsfall, verwenden Sie doppelte eckige Klammern, wenn Sie möchten, wählen Sie einen Daten-frame, erstellt von der
split()
Funktion. Wenn Sie nicht wissen,split()
Gruppen eine Liste/Daten-frame in Teilmengen, basierend auf einem Schlüsselfeld. Es ist nützlich, wenn Sie arbeiten wollen, auf mehrere Gruppen, plot, etc.InformationsquelleAutor der Antwort Peter
Als terminologische,
[[
Betreiber Auszüge das element aus einer Liste in der Erwägung, dass[
Betreiber übernimmt Teilmenge einer Liste.InformationsquelleAutor der Antwort submartingale