2013-04-16 7 views
14

R에 "Python-like generators"의 구현을 용이하게하거나 제공하는 패키지 또는 언어 구문이 있습니까? "파이썬 같은 발전기"나는 될 것 R 구문, 호출 사이에 상태를 유지하고 파이썬에서 키워드 에게 항복을 빌리 기능을 의미하여Generator functions in R

뭔가 같은 :

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

수율 대신으로 다음 함수를 세 번 연속을 요구하는 반환는 줄 것이다 :

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

편집 : 나는 밖으로 남긴으로 이터레이터와 다른 파이썬 생성기를 사용합니다. iterate 할 객체의 전체 목록은 첫 번째 호출에서 빌드 된 다음 반복되지만 각 함수 호출은 해당 호출에 대해 리턴 할 하나의 요소를 작성합니다.

+1

R은 기능적인 언어로 시도하여 그렇게 할 수 있습니다. 이 요청은 비 기능적 접근에 의해서만 성취 될 수 있습니다. 필요하다면'<< -'를 사용하여 기능을 파괴 할 수 있지만, 최종 결과로 원하는 것을 생각해 내고 기능적 해결책을 찾는 것이 좋습니다. –

+0

비슷한 질문 : http://stackoverflow.com/questions/23509381/lazy-sequences-in-r – cbare

+0

또한 Luke Tierney는 [지연 목록 구현] (http://homepage.cs.uiowa.edu/~)을 작성했습니다. luke/R/lazy/lazy.pdf). – cbare

답변

15

iterators 패키지는이 기능을

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

있다 또는 당신은 lambda.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 

참고 블로그 게시물에 더 많은 예제가

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

에서 수정됩니다. 당신은 가능한 목록에서 선택합니다

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" 
+0

답변을 주셔서 감사합니다. 불행히도 반복자는 제가 말한 것이 아니며, 파이썬 생성기 기능에 익숙하지 않은 사람들에게는 반복자를 분명히하지 않았다고 생각합니다. – papirrin

+0

@papirrin - 내 편집 참조. – mnel

+0

좋은 편집, 심지어 내가하지 않은 질문에 대답. – papirrin