如何复制R的迭代器

时间:2016-03-14 15:33:06

标签: r iterator

通常所有R的对象都是不可变的,具有复制修改语义。对于具有引用语义的environments,情况并非如此。 R(iterators package)中的迭代器是使用environments实现的,并且是可变的。这可能令人困惑。请考虑以下简单示例:

library(iterators)
it1 <- iter(1:4)
it2 <- it1

nextElem(it1)
# 1
nextElem(it2)
# 2

这不是大多数R用户所期望的。 问题是如何有效地制作迭代器的副本? 目前,对于上面的简单案例,我有一个凌乱的解决方案(借用this idea):

it1 <- iter(1:4)
it2 <- it1
it2$state  <- as.environment(as.list(it1$state))
next_el(it1)
# 1
next_el(it2)
# 1

但我觉得我错过了一些东西,而且看起来也不像是一般的解决方案。

1 个答案:

答案 0 :(得分:0)

我最终在R6之上重新实现了迭代器(感谢@ hadley在twitter上的建议)。 R6包含带clone选项的方便deep = c(TRUE, FALSE)方法。有兴趣的人可以找到示例here