如何在 R 环境中遍历哈希项?
Posted
技术标签:
【中文标题】如何在 R 环境中遍历哈希项?【英文标题】:How to iterate through hash items, in an R environment? 【发布时间】:2011-11-16 15:44:29 【问题描述】:我正在尝试找到一种在 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)
【问题讨论】:
ls
返回名称,而不是对象。试试print(map[[v]]
【参考方案1】:
在需要解释输入的函数中使用“$”是编程错误的常见来源。改用表单 object[[value]](不带引号。)
for (v in ls(map))
print(map[[v]])
【讨论】:
【参考方案2】:这取决于你想做什么。我假设您上面的 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)
OP 的问题是他不知道如何遍历环境。我告诉他一个方便的功能来做到这一点。一个很好地遵循 R 的习语。
没错,但他也有具体的案例使用,现在答案更好,所以你有我的投票。但请注意:由于 print
的副作用,在 *apply
语句中使用时并不总是能提供您所期望的。
@James:是的,你是对的。匆忙中,我错过了更多解释eapply()
将提供的额外功能的机会。我修改了答案。
第二个示例中“function(e)”中的 e 是什么?它是某种结构的键值对吗?或者它是关键还是价值?我很困惑。以上是关于如何在 R 环境中遍历哈希项?的主要内容,如果未能解决你的问题,请参考以下文章