我試圖找到一種方法來在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)
}
我試圖找到一種方法來在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)
}
在希望解釋輸入的函數中使用「$」是編程錯誤的常見原因。使用替代形式對象[[value]](不包括引號)。
for (v in ls(map)) {
print(map[[v]])
}
謝謝你,它的作品! –
這取決於你想要做什麼。我假設你的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的習慣用法。它負責爲您迭代並創建結果列表。
提供一個例子來解決OP的問題會更好一些:'eapply(map,identity)' – James
OP的問題是他不知道如何遍歷我告訴他一個方便的功能來做這件事,一個很好地遵循R的成語 – adamleerich
沒錯,但他也有一個特定的案例使用,現在答案更好,所以你有我的投票。 :由於它的副作用,'print'並不總是給出你在'* apply'語句中使用的期望。 – James
'ls'返回名稱,而不是對象。嘗試'print(map [[v]]' –