Функции генератора в R

Существует ли в R # конструктор пакетов или языков, который облегчает или обеспечивает реализацию " Python-подобных генераторов"?

Под "Python-подобными генераторами" я подразумеваю функции, которые сохраняют состояние между вызовами, в синтаксисе R и заимствовании ключевого слова yield из Python будет выглядеть примерно так:

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

С yield вместо return, то вызов функции три раза подряд даст:

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

Изменить: я не учитывал аспект генераторов Python, который отличает их от итераторов. Дело в том, что весь список объектов для итерации не построен на первом вызове, а затем повторяется, но каждый вызов функции создает один элемент, который будет возвращаться для этого вызова.

Ответ 1

В пакете 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"