2011-09-14 19 views
6

Próbuję znaleźć sposób użycia mapy mieszania w R, a po niektórych wyszukiwania otrzymuję środowisko R. Ale jak mogę iterować przez wszystkie elementy w środowisku? Kiedy uruchomić poniższy kod, spodziewałem wyjście tak:Jak iterować elementy hash, w środowisku R?

Ale mam dwa wiersze NULL zamiast, jak mogę dostać to, co chcę?

map <- new.env(hash=T, parent=emptyenv()) 
assign('a', 1, map) 
assign('b', 2, map) 
for (v in ls(map)) { 
    print(map$v) 
} 
+0

'ls' zwraca nazwy, a nie obiekty. Spróbuj 'print (map [[v]]' –

Odpowiedz

10

Użycie "$" w funkcji, w której należy interpretować dane wejściowe, jest częstym źródłem błędów programowania. Zamiast tego użyj obiektu formularza [[wartość]] (bez cudzysłowu).

for (v in ls(map)) { 
    print(map[[v]]) 
} 
+0

Dzięki człowieku, to działa! –

7

To zależy od tego, co chcesz zrobić. Domyślam się, że powyższy przykład to coś, co robisz właśnie jako przykład, ale możesz chcieć zrobić coś więcej niż drukować!

Aby uzyskać obiekt oparty na każdym elemencie środowiska, należy użyć eapply(env, function). Działa tak jak inne funkcje *apply(). Zwraca listę, której obiektami są obiekty utworzone z funkcji przekazanej do eapply() i których nazwy są kopiowane ze środowiska.

Na przykład, w konkretnym przypadku

map <- new.env(hash=T, parent=emptyenv()) 
assign('a', 1, map) 
assign('b', 2, map) 

eapply(map, identity) 

zwraca listę tych dwóch elementów. Wygląda to trochę jak tabela mieszająca pokazująca, że ​​można zaimplementować tablicę asocjacyjną jako listę zamiast środowiska (które jest trochę nieortodoksyjne, ale zdecydowanie interesujące).

Aby zobaczyć, jak to będzie działać przez jakiś nietrywialne, niestandardowych funkcji, tutaj jest przykładem

eapply(map, function(e) { 
    # e here stands for a copy of an element of the environment 
    e <- my.function(e) 
    my.other.function(e) 
}) 

Jeśli zamiast tego chcesz zrobić coś dla każdego z elementów środowiska, bez powrotu obiekt listy na końcu, należy użyć pętli for jak @DWin w swojej odpowiedzi.

Martwię się jednak, że tak naprawdę nie będziesz chciał drukować, ale ostatecznie utworzysz obiekty oparte na elementach "tablicy mieszającej", a następnie wepchniesz je z powrotem na listę do dalszego przetwarzania. W takim przypadku powinieneś naprawdę użyć eapply(). Kod będzie czystszy i będzie bardziej zgodny z idiomami R. Dba o iterację i tworzenie listy wyników dla ciebie.

+0

Lepiej podać przykład rozwiązania problemu OP: 'Eapply (mapa, tożsamość)' – James

+0

Problem PO polega na tym, że on nie wie jak iterować przez A ja opowiedziałem mu o przydatnej funkcji do zrobienia tego, jeden, który brzmi raczej idiom R, ładnie – adamleerich

+0

To prawda, ale on również miał konkretny przypadek użycia, odpowiedź jest teraz lepsza, więc masz głos ode mnie. : z powodu swoich skutków ubocznych, 'print' nie zawsze daje to, czego się spodziewasz, gdy jest użyte w instrukcjach' * apply' . – James