Funciones del generador en R

¿Existe un paquete o construcción de lenguaje en R que facilite o proporcione la implementación de ” generadores similares a Python “?

Por “generadores similares a Python” me refiero a las funciones que mantienen el estado entre las llamadas, en la syntax R y tomando prestado el rendimiento de la palabra clave de Python será algo como:

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

Con el rendimiento en lugar de un retorno , entonces llamar a la función tres veces consecutivas daría:

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

Edición: Dejé de lado un aspecto de los generadores de Python que los hace diferentes de los iteradores. Es que la lista completa de objetos para iterar no se construye en la primera llamada y luego se itera, pero cada llamada a función crea el elemento que regresará para esa llamada.

El paquete de iterators tiene esta funcionalidad.

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

O podrías usar lambda.r y <<- . Este ejemplo es modificado de

http://cartesianfaith.wordpress.com/2013/01/05/infinite-generators-in-r/

Hay más ejemplos en la publicación del blog.

 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 

tenga en cuenta que también podría usar una función regular para hacer esto.

 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 

Si desea seleccionar de una posible lista, entonces tal vez podría hacerlo usando el 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"