我试图找到一种在R中使用散列映射的方法,经过一些搜索,我得到了R-environment。但是,如何遍历环境中的所有项呢?当我运行以下代码时,我期望输出如下所示:
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)
}发布于 2011-09-14 10:36:06
在需要解释输入的函数中使用"$“是编程错误的常见来源。请改用表单对象[value]
for (v in ls(map)) {
print(map[[v]])
}发布于 2011-09-14 10:18:07
这取决于你想做什么。我假设上面的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)
})如果你想为一个环境的每个元素做一些事情,而不是在最后返回一个列表对象,你应该使用一个for循环,就像@DWin在他的回答中所做的那样。
不过,我担心的是,您不会真的只想打印,而是最终会基于您的“哈希表”元素创建对象,然后将它们重新填充到列表中进行进一步处理。在这种情况下,您应该真正使用eapply()。代码会更整洁,更符合R的习惯用法。它负责为您迭代和创建结果列表。
https://stackoverflow.com/questions/7410561
复制相似问题