【问题标题】:Generator functions in RR中的生成器函数
【发布时间】:2013-04-08 08:18:35
【问题描述】:

R 中是否存在促进或提供“Python-like generators”实现的包或语言结构?

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

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

使用 yield 而不是 return,然后连续调用该函数 3 次将给出:

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

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

【问题讨论】:

标签: python r python-3.x generator


【解决方案1】:

iterators 包具有此功能

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

或者您可以使用lambda.r&lt;&lt;-。本例修改自

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 生成器函数的人说清楚。
【解决方案2】:

来自r-lib 团队的最新coro 包(协程)提供了生成器、迭代器和自适应生成器。生成器的行为完全符合预期(来自文档的复制粘贴示例):

library(coro)

generate_abc <- generator(function() {
  for (x in letters[1:3]) {
    yield(x)
  }
})
# Create the iterator
abc <- generate_abc()

# Use the iterator by invoking it
abc()
#> [1] "a"

abc()
#> [1] "b"

# Last value
abc()
#> [1] "c"

# Exhaustion sentinel
abc()
#> exhausted

abc()
#> exhausted

https://github.com/r-lib/coro查看更多信息

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-12-16
    • 2019-06-27
    • 2021-12-23
    • 2019-04-20
    • 1970-01-01
    • 2014-06-22
    • 2019-12-07
    相关资源
    最近更新 更多