2013-04-16 17 views
14

"Python-like generators"の実装を容易にする、または提供するパッケージまたは言語構造がRにありますか?ジェネレータ関数in R

「Pythonのような発電機は」私が呼び出し間で状態を維持する機能を意味し、R構文でと借り入れのPythonからキーワード利回りのようなものになりますで:利回り

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

の代わりに、

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

編集:私はなどを残し、その後3回連続で与える関数を呼び出すリターン、それらをイテレータとは異なるようにするPythonジェネレータの恩恵を受ける。反復するオブジェクトのリスト全体が最初の呼び出しで構築されてから繰り返し処理されますが、各関数呼び出しはその呼び出しのために返される要素を1つ作成します。

+1

を使用してそれを行うことができます。この要求は、機能しないアプローチによってのみ実現できます。必要に応じて '<< - 'で機能を覆すことができますが、最終的な結果を考え、機能的な解決策を見つける方がよいでしょう。 –

+0

同様の質問:http://stackoverflow.com/questions/23509381/lazy-sequences-in-r – cbare

+0

また、Luke Tierneyは[Lazy List Implementation](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 

あなたは可能リストから選択したい場合は、おそらくRは、関数型言語になろうと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

あなたの答えをお寄せいただきありがとうございます。残念ながら、イテレータは私が話していたものではありません。私はPythonジェネレータ関数に慣れていない人にとっては明確ではないと思います。 – papirrin

+0

@papirrin - 私の編集を参照してください。 – mnel

+0

ニースの編集、それは私がしなかった質問にも答える。 – papirrin