【问题标题】:How to copy R's iterator如何复制R的迭代器
【发布时间】: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
  • 这个问题是从#65#71 提出的。用户对此类行为感到困惑。而且我个人也不喜欢那样。
  • 好吧,我建议按照 data.table devs 的例子,提供一个copy 函数。这可能是您在上面使用的,或者您可能会编写一个复制环境的 C 函数。或者如果你不介意其他依赖,你可以使用restorepoint::clone.environment

标签: r iterator


【解决方案1】:

最后我在R6 之上重新实现了迭代器(感谢@hadley 在推特上的建议)。 R6 包括方便的clone 方法和deep = c(TRUE, FALSE) 选项。有兴趣的可以找例子here

【讨论】:

    猜你喜欢
    • 2020-04-10
    • 2015-01-01
    • 1970-01-01
    • 2011-12-09
    • 2018-10-02
    • 2021-09-03
    • 2015-09-12
    • 2013-02-11
    相关资源
    最近更新 更多