如何在R环境中迭代哈希项?

时间:2011-09-14 02:13:42

标签: r loops dictionary hash idioms

我正在尝试找到一种在R中使用哈希映射的方法,经过一些搜索后我得到了R环境。 但是,如何迭代环境中的所有项目? 当我运行以下代码时,我期待这样的输出:

1

2

但我得到了两行NULL,我怎样才能得到我想要的东西?

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

2 个答案:

答案 0 :(得分:11)

在希望解释输入的函数内使用“$”是编程错误的常见来源。而是使用表单对象[[value]](不带引号。)

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

答案 1 :(得分: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循环。< / p> 但是,我担心的是,你不会真的只想打印,而是最终会根据你的“哈希表”元素创建对象,然后将它们填回列表进行进一步处理。在那种情况下,您应该使用eapply()。代码将更清晰,它将更加严格地遵守R的习语。它负责迭代并为您创建结果列表。