如何在 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 环境中遍历哈希项?的主要内容,如果未能解决你的问题,请参考以下文章

如何使用咖啡脚本遍历 JSON 哈希

如何在数组元素中搜索哈希键中的匹配项

Laravel,Predis - 如何遍历哈希

如何检查数组的至少一项是不是包含在对象数组中并遍历所有对象(JS)

如何检查哈希中是不是存在特定值?

如何在 Lua 中获取哈希表中的键数?