R中的发电机功能

时间:2013-04-16 03:41:45

标签: python r python-3.x generator

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

“类似Python的生成器”是指在调用R语法和从Python中借用关键字 yield 之类的函数之间保持状态的函数类似于:

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

使用产量而不是返回,然后连续三次调用该函数会产生:

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

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

1 个答案:

答案 0 :(得分:21)

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"
相关问题