odpowiednik dyktu Pythona w R

83

Chcę zrobić odpowiednik dyktu w języku Python w R. Zasadniczo w Pythonie mam:

visited = {}

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

Pomysł jest taki, że jeśli zobaczyłem ten konkretny atom_count, odwiedziłem [atom_count] = 1. Tak więc, jeśli ponownie zobaczę ten atom_count, nie wykonuję „Rób rzeczy”. Atom_Count to liczba całkowita.

Dzięki!

user1357015
źródło
5
Zobacz pakiet R hashz jego funkcjami dostępu prawie podobnymi do Pythona.
Hans W.
@Chase, który kosztowałby O (n). Dostęp do elementu dyktowania jest stały.
anilbey

Odpowiedzi:

73

Najbliższa dyktando Pythona w R to po prostu lista. Podobnie jak większość typów danych języka R, listy mogą mieć atrybut nazw, który pozwala listom działać jak zestaw par nazwa-wartość:

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

A teraz zwykłe zastrzeżenie: nie są dokładnie takie same; będą różnice. Będziesz więc kusić rozczarowaniem, próbując dosłownie używać list dokładnie w taki sam sposób, jak dyktowanie w Pythonie.

joran
źródło
jak można programowo iterować po takiej liście? naiwny l$names(l)[1]oczywiście zawodzi. ja też nie mogłem dostać się l[which()]do pracy
pitt
@MikePalmice Oprócz forpętli, która jest opcją w prawie każdym języku, istnieje lapply. Istnieją również powiązane rzeczy o różnej składni, takie jak Mapi cały pakiet, mruczący dla wielu funkcjonalnych rzeczy związanych z programowaniem.
joran
@MikePalmice, myślę, że l[[names(l)[1]]powinno działać. W każdym razie możesz po prostu iterować w ten sposób: l[[1]]bez używania nazw. Zwróć uwagę, że pojedyncze nawiasy []zwracają listę, a podwójne nawiasy [[]]zwracają obiekt wewnątrz listy.
Javi_VM
1
wow, taka prosta rzecz w innych językach jest trudna w r? Powiedzmy, że mam ciąg zawarty w zmiennej. Jeśli spróbuję uczynić go kluczem, po prostu wybiera nazwę zmiennej jako nazwę klucza zamiast wartości zmiennej.
wondim
1
@wondim Możesz ustawić nazwy elementów listy ze zmiennej za pomocą names(list) <- vector_of names, podzlecone przypisanie również działa names(list)[1] <- "foo". Zobacz także setNames().
joran
5

Uważam, że rozwiązaniem problemu może być użycie tablicy mieszającej (stworzenie nowego środowiska). Pisałem, jak to zrobić, ale zrobiłem to wczoraj na talkstats.com.

Jeśli twój słownik jest duży i ma tylko dwie kolumny, może to być właściwy sposób. Oto link do wątku Talkstats z przykładowym kodem R:

HASH TABELA LINK

Tyler Rinker
źródło
data.tableNazwane wyszukiwania wektorowe Note i R. znacznie się poprawiły od tego czasu.
Tyler Rinker
4

Jeśli, tak jak w Twoim przypadku, chcesz, aby Twój „słownik” przechowywał wartości tego samego typu, możesz po prostu użyć wektora i nazwać każdy element.

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

Jeśli chcesz uzyskać dostęp do „kluczy”, użyj names.

> names(l)
[1] "a" "b" "f"
user2739472
źródło