我正在尝试找到一种在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)
}
答案 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的习语。它负责迭代并为您创建结果列表。