Der*_*ang 8 hash dictionary loops idioms r
我正试图在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)
}
Run Code Online (Sandbox Code Playgroud)
42-*_*42- 11
在希望解释输入的函数内使用"$"是编程错误的常见来源.使用表单对象[[value]](不带引号).
for (v in ls(map)) {
print(map[[v]])
}
Run Code Online (Sandbox Code Playgroud)
这取决于你想做什么.我假设您print上面的示例是您正在做的事情,但您可能想要做的不仅仅是打印!
如果要根据环境的每个元素获取对象,则使用eapply(env, function).它的工作方式与其他*apply()功能类似.它返回一个列表,其对象是您从传递给函数创建的对象eapply(),其名称将从环境中复制.
例如,在您的具体情况下
map <- new.env(hash=T, parent=emptyenv())
assign('a', 1, map)
assign('b', 2, map)
eapply(map, identity)
Run Code Online (Sandbox Code Playgroud)
返回两个元素的列表.它看起来很像哈希表,表明你可以将哈希表实现为列表而不是环境(这有点非正统,但绝对有趣).
为了了解这对于一些非平凡的自定义函数如何工作,这是一个例子
eapply(map, function(e) {
# e here stands for a copy of an element of the environment
e <- my.function(e)
my.other.function(e)
})
Run Code Online (Sandbox Code Playgroud)
如果您想要为环境的每个元素执行某些操作,而不在最后返回列表对象,则应该使用像@DWin这样的for循环.
不过,我担心的是你不会真的只想打印,而是最终会根据你的"哈希表"元素创建对象,然后将它们填回列表进行进一步处理.在那种情况下,你应该真的使用eapply().代码将更清晰,它将更加严格地遵守R的习语.它负责迭代并为您创建结果列表.
| 归档时间: |
|
| 查看次数: |
5925 次 |
| 最近记录: |