2011-09-14 63 views
6

我試圖找到一種方法來在R中使用哈希映射,並在一些搜索後,我得到了R環境。 但是我怎樣才能遍歷環境中的所有項目? 當我運行下面的代碼,我期待輸出是這樣的:如何在R環境中迭代散列項目?

,但我得到NULL代替兩行,我怎樣才能得到我想要什麼?

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'返回名稱,而不是對象。嘗試'print(map [[v]]' –

回答

10

在希望解釋輸入的函數中使用「$」是編程錯誤的常見原因。使用替代形式對象[[value]](不包括引號)。

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

謝謝你,它的作品! –

7

這取決於你想要做什麼。我假設你的print例子是你正在做的一個例子,但你可能想要做的不僅僅是打印!

如果你想獲得一個基於環境的每個元素的對象,那麼你使用eapply(env, function)。它的功能與其他*apply()功能類似。它返回一個列表,其對象是您從傳遞給eapply()的函數創建的對象,其名稱是從環境中複製而來的。

例如,在特定情況下

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

eapply(map, identity) 

返回兩個元素的列表。它看起來很像一個哈希表,表明你可以實現一個哈希表而不是一個環境(這有點不正統,但絕對有趣)。

要看到這是如何了一段不平凡的,自定義函數的工作,這裏有一個例子

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

如果你不是想東西每一個環境的元素,而無需返回最後一個列表對象,你應該使用@DWin在他的答案中做的for循環。

不過,我擔心的是你不會真的想要打印,但是你最終將根據你的「散列表」元素創建對象,然後將它們填充到列表中供進一步處理。在這種情況下,你應該真的使用eapply()。代碼將更加清晰,並將更加緊密地遵守R的習慣用法。它負責爲您迭代並創建結果列表。

+0

提供一個例子來解決OP的問題會更好一些:'eapply(map,identity)' – James

+0

OP的問題是他不知道如何遍歷我告訴他一個方便的功能來做這件事,一個很好地遵循R的成語 – adamleerich

+0

沒錯,但他也有一個特定的案例使用,現在答案更好,所以你有我的投票。 :由於它的副作用,'print'並不總是給出你在'* apply'語句中使用的期望。 – James