【发布时间】:2016-06-29 17:42:55
【问题描述】:
通常所有 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
但我觉得我错过了一些东西,而且它看起来也不是一般的解决方案。
【问题讨论】:
-
简单回答:不要复制迭代器。如果您仍然需要它,您可以将您的代码包装到一个函数中并调用它
copy。 -
好吧,我建议按照 data.table devs 的例子,提供一个
copy函数。这可能是您在上面使用的,或者您可能会编写一个复制环境的 C 函数。或者如果你不介意其他依赖,你可以使用restorepoint::clone.environment。