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相关问答推荐

为什么打印语句在Python多处理脚本中执行两次?

将数据帧扩展为矩阵索引

PySpark每毫秒使用先前的值填充数据

如何定义部署用 Python 编写的 Firestore 第二代函数的区域/位置?

在Python中基于组/ID将两个数据帧进行映射,找出较接近的值

Python (pandas) - 判断一个 df 中的值是否在另一个(不相等)df 中的任何对之间

过滤列表中的所有字典以使用特定键并忽略其他键?

根据另一列值对多个数据框列进行分组

Pandas 值列中列表中元素的计数

正则表达式:匹配字符串中的分隔符(字母和特殊字符)以形成新的子字符串

Semaphore信号量 Python 的工作原理

内部如何使用 Python 语法?

有没有更好的方法来判断一个数字是否是两个数字的范围

django rest框架中的save()、create()和update()有什么区别?

如何确定一个类的元类?

使用逗号时,除了处理程序中的语法无效

如何通过命令行将数组传递给python

AttributeError:系列对象没有属性iterrows

如何使用已打开并使用登录凭据登录的浏览器

为什么异步库比这个 I/O 绑定操作的线程慢?