R中是否有一个包或语言结构,可以促进或提供"Python-like generators"的实现?

我所说的"类Python生成器"是指在调用之间保持状态的函数,在R语法中,borrow Python中的关键字yield将类似于:

iterable.fun <- function(){
  yield list('a','b','c')
}

如果使用yield而不是return,则连续调用函数三次将给出:

> iterable.fun()
  'a'
> iterable.fun()
  'b'
> iterable.fun()
  'c'

编辑:我遗漏了Python生成器的一个方面,这使它们不同于迭代器.需要迭代的对象的整个列表不是在第一次调用时构建的,而是在第一次调用后进行迭代的,但是每个函数调用都会创建一个元素,该元素将为该调用返回.

推荐答案

iterators软件包有这个功能

library(iterators)
abc <- iter(c('a','b','c'))
nextElem(abc)
## [1] "a"
nextElem(abc)
## [1] "b"
nextElem(abc)
## [1] "c"

或者你可以用lambda.r<<-.这个例子是从

http://cartesianfaith.wordpress.com/2013/01/05/infinite-generators-in-r/

这篇博文中还有更多的例子

library(lambda.r)
seq.gen(start) %as% {
  value <- start - 1L
  function() {
    value <<- value + 1L
    return(value)
  }
}



foo <- seq.gen(1)
foo()
## [1] 1
foo()
## [1] 2
foo()
## [1] 3

请注意,您也可以使用常规函数来实现这一点.

seq.gen <-function(start) {
  value <- start - 1L
  function() {
    value <<- value + 1L
    return(value)
  }
}
foo2 <- seq.gen(1)
foo2()
## [1] 1
foo2()
## [1] 2
foo2()
## [1] 3

如果你想从一个可能的列表中进行选择,那么你可以使用switch

seq.char(start) %as% {
  value <- start - 1L
  function() {
    value <<- value + 1L
    return(switch(value,'a','b','c'))
  }
}

foo.char <- seq.char(1)
 foo.char()
## [1] "a"
 foo.char()
## [1] "b"
 foo.char()
## [1] "c"

Python-3.x相关问答推荐

集合操作:应该只适用于集合,但适用于 dict_keys?

将名字转换成姓氏、首字母和中间字母的格式

如何在python中将列表转换为其他格式

IronPython 3 支持?

ValueError:FixedLocator 位置的数量 (5),通常来自对 set_ticks 的调用,与刻度标签的数量 (12) 不匹配

尾部斜杠的 FastAPI 重定向返回非 ssl 链接

如何在 FastAPI 中的一条路由上捕获任意路径?

如何在不更改任何默认值的情况下在 Ubuntu 上为 python 3.8 安装 pip?

全局捕获快速 api 中的“异常”

如何从另一个目录导入 python 包?

如何用decorator 绕过python函数定义?

为什么 time.sleep() 准确性受 Chrome 影响?

如何修复 AttributeError:部分初始化的模块?

python中整数除法和float到int转换之间差异的原因是什么?

如何提高数据输入管道性能?

使用 pytest.fixture 返回模拟对象的正确方法

RuntimeError:输入类型(torch.FloatTensor)和权重类型(torch.cuda.FloatTensor)应该相同

是否有 Python 3.x 发布生命周期的官方指南?

更新错误“模块”对象不可调用后 pip 不再工作

简单的 get/post 请求在 python 3 中被阻止,但在 python 2 中没有