R中是否有一个包或语言 struct ,可以促进或提供"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

如果你想从一个可能的列表中进行 Select ,那么你可以使用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相关问答推荐

如何有效地计算Kernel/Matrix

Django 模型类方法使用错误的 `self`

如何根据索引子列表对元素列表进行分组或批处理?

Python 列表求和所有出现的保留顺序

位对的距离

非拉丁字符的Python正则表达式不起作用

如何将数据框中的每一行转换为具有属性的 node ?

为什么 setattr 在绑定方法上失败

UnicodeDecodeError:utf-8编解码器无法解码位置 1 的字节 0x8b:无效的起始字节,同时读取Pandas中的 csv 文件

为 python3 安装 opencv

Python3 mysqlclient-1.3.6(又名 PyMySQL)的用法?

使用打印时,用+连接是否比用,分隔更有效?

Selenium (Python) - 使用 Chrome 网络驱动程序等待下载过程完成

从大字典中弹出 N 项的最快方法

在 ubuntu 20.04 中安装 libpq-dev 时出现问题

没有名为urlparse的模块,但我没有使用 urlparse

命名参数可以与 Python 枚举一起使用吗?

如何删除目录? os.removedirs 和 os.rmdir 是否只用于删除空目录?

如何从集合中删除多个元素?

在 PyCharm 中配置解释器:请使用不同的 SDK 名称