Äquivalent eines Python-Diktats in R.

82

Ich möchte das Äquivalent eines Python-Diktats in R machen. Grundsätzlich habe ich in Python:

visited = {}

if atom_count not in visited:
  Do stuff
  visited[atom_count] = 1

Die Idee ist, wenn ich diesen spezifischen atom_count gesehen habe, habe ich [atom_count] = 1 besucht. Wenn ich diesen atom_count also wieder sehe, mache ich nicht "Do Stuff". Atom_Count ist eine Ganzzahl.

Vielen Dank!

user1357015
quelle
5
Sehen Sie sich das R-Paket hashmit seinen fast Python-ähnlichen Zugriffsfunktionen an.
Hans W.
@Chase, die O (n) kosten würde. Der Zugriff auf Dict-Elemente ist konstant.
Anilbey

Antworten:

72

Das, was einem Python-Diktat in R am nächsten kommt, ist einfach eine Liste. Wie die meisten R-Datentypen können Listen ein Namensattribut haben, mit dem sich Listen wie eine Reihe von Name-Wert-Paaren verhalten können:

> l <- list(a = 1,b = "foo",c = 1:5)
> l
$a
[1] 1

$b
[1] "foo"

$c
[1] 1 2 3 4 5

> l[['c']]
[1] 1 2 3 4 5
> l[['b']]
[1] "foo"

Nun zum üblichen Haftungsausschluss: Sie sind nicht genau gleich; Es wird Unterschiede geben. Sie werden also zu Enttäuschungen einladen, wenn Sie versuchen, Listen buchstäblich so zu verwenden, wie Sie ein Diktat in Python verwenden könnten.

Joran
quelle
Wie können Sie eine solche Liste programmgesteuert durchlaufen? Die Naivität l$names(l)[1]versagt offensichtlich. Ich war auch nicht in der Lage, l[which()]zur Arbeit zu kommen
3pitt
@MikePalmice Abgesehen von einer forSchleife, die in so ziemlich jeder Sprache eine Option ist, gibt es eine lapply. Es gibt auch verwandte Dinge mit unterschiedlicher Syntax, wie Mapund ein ganzes Paket, purrr für viele funktionale Programmieraufgaben.
Joran
@ MikePalmice, ich denke l[[names(l)[1]]sollte funktionieren. Wie auch immer, Sie können einfach so iterieren: l[[1]]ohne die Namen zu verwenden. Beachten Sie, dass einfache Klammern []eine Liste zurückgeben, während doppelte Klammern [[]]das Objekt in der Liste zurückgeben.
Javi_VM
1
wow, so eine einfache Sache in anderen Sprachen ist in r schwierig? Nehmen wir an, ich habe eine Zeichenfolge in einer Variablen enthalten. Wenn ich versuche, daraus einen Schlüssel zu machen, wird nur der Variablenname als Schlüsselname anstelle des Werts der Variablen ausgewählt.
Wondim
1
@wondim Sie können Listenelementnamen aus einer Variablen mit names(list) <- vector_of namesuntergeordneter Zuweisung festlegen names(list)[1] <- "foo". Siehe auch setNames().
Joran
5

Ich glaube, dass die Verwendung einer Hash-Tabelle (Erstellen einer neuen Umgebung) die Lösung für Ihr Problem sein kann. Ich würde schreiben, wie das geht, aber ich habe es gestern bei talkstats.com getan.

Wenn Ihr Wörterbuch groß ist und nur zwei Spalten enthält, ist dies möglicherweise der richtige Weg. Hier ist der Link zum Talkstats-Thread mit Beispiel-R-Code:

HASH TABLE LINK

Tyler Rinker
quelle
data.tableDie benannten Vektor-Lookups von Note und R haben sich seitdem drastisch in der Geschwindigkeit verbessert.
Tyler Rinker
4

Wenn Sie wie in Ihrem Fall nur möchten, dass Ihr "Wörterbuch" Werte desselben Typs speichert, können Sie einfach einen Vektor verwenden und jedes Element benennen.

> l <- c(a = 1, b = 7, f = 2)
> l
a b f 
1 7 2

Wenn Sie auf die "Schlüssel" zugreifen möchten, verwenden Sie names.

> names(l)
[1] "a" "b" "f"
user2739472
quelle