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!
python
r
dictionary
user1357015
źródło
źródło
hash
z jego funkcjami dostępu prawie podobnymi do Pythona.Odpowiedzi:
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.
źródło
l$names(l)[1]
oczywiście zawodzi. ja też nie mogłem dostać sięl[which()]
do pracyfor
pętli, która jest opcją w prawie każdym języku, istniejelapply
. Istnieją również powiązane rzeczy o różnej składni, takie jakMap
i cały pakiet, mruczący dla wielu funkcjonalnych rzeczy związanych z programowaniem.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.names(list) <- vector_of names
, podzlecone przypisanie również działanames(list)[1] <- "foo"
. Zobacz takżesetNames()
.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
źródło
data.table
Nazwane wyszukiwania wektorowe Note i R. znacznie się poprawiły od tego czasu.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"
źródło