私は、順列イテレータが連続して動作すると思うので、ランダムにサンプリングする方法はありません。あなたが行うことができるのは、間接的に親イテレータにnextElem
を呼び出して、間引きされたバージョンを返すイテレータを作成することです。この例では、いくつかの「薄い」パラメータを経由して、イテレータの薄くなったバージョンを作成します。
> thinit = function(iterator,thin){
iter(
function(){
for(i in 1:(thin-1)){
nextElem(iterator)
}
nextElem(iterator)}
)
}
注意を最後の呼び出しはイテレータの戻り値となるように、私はループでthin-1
回それを呼び出します。したがって
、単純な1から始まる:100イテレータ:
> i1 <- iter(1:100)
間引きバージョン作る:
> i10 = thinit(i1, 10)
を、ループ出力を薄くする:
> foreach(i=i10) %dopar% {i}
[[1]]
[1] 10
[[2]]
[1] 20
[[3]]
[1] 30
等今、あなたはラッパー呼び出しnextElem
を乱数にすることができます(それがを返す限りを呼び出すと、イテレータとして機能します)、親イテレータからランダムなサンプルを取得します。 を正確にの250個のサンプルを順列から得ることはできませんが、2500個の置換があり、nextElem
をrunif(1)>.9
まで呼び出すと、平均250を取得します。このように:
親イテレータはビッグN回呼ばれますが、サンプリングは私がどこである疑いがあるだけ少ない回数と呼ばれる
{i}
であなたのループの肉を、意味している。なお
> pthin = function(iterator, p){
iter(
function(){
while(runif(1)<p){
nextElem(iterator)
}
nextElem(iterator)
}
)
}
> i1 <- iter(1:100)
> ip10 = pthin(i1,.9)
> unlist(foreach(i=ip10) %dopar% {i})
[1] 1 9 18 19 22 28 35 38 53 55 63 67 81 84 86 89 95 98
> i1 <- iter(1:100)
> ip10 = pthin(i1,.9)
> unlist(foreach(i=ip10) %dopar% {i})
[1] 15 19 21 24 45 59 63 70 73 76 79 88 94 100
> i1 <- iter(1:100)
> ip10 = pthin(i1,.9)
> unlist(foreach(i=ip10) %dopar% {i})
[1] 10 50 62 76 79 81 97
のほとんど時間が費やされます。
親イテレータから与えられたN個のサンプルを本当に主張していて、イテレータの要素の数を知っている場合は、それからNのサンプルを計算し、上記のようにイテレータラッパーを使用して、親にnextElem
あなたのサンプルの次のインデックスに到達するまで、それを返します。私の例のように、クロージャで返されるサンプルの状態を保持する必要があります。
元のイテレーターの値を1からNまでの連続したインデックス番号と共に生成するイテレーターを戻すイテレーター・ラッパーを作成します(この場合、より多くのコーヒーが必要です)。これはpython zip
のようなものです。その後、インデックス番号がサブセット内にある反復でのみ作業します。元のイテレータの長さは、サブセットを生成することがわかっている必要があります。例:
これは私のzip
イテレータラッパーです。あなたが望むよう
> zipit = function(iz){
itn=1
iter(
function(){
itn<<-itn+1
list(index=itn-1,value=nextElem(iz))
}
)
}
今すぐ順列イテレータを作成します。それは$index
が連続指数であり、$value
が親イテレータからの値であり、リストの要素を生成し、イテレータを返します。私たちは、この1つは、合計で10個の要素を持って知っているので、10から4つの値のサンプルを生成します。
> I <- iterpc(5, 2)
> it <- iter_wrapper(I)
> subset = sample(10,4)
今、あなたのメインループは(この場合、値の単純合計)テストとプロセスだけそれらの反復を持っていますサブセット:
> foreach(i=zipit(it), .combine=c) %do% {if(i$index %in% subset)sum(i$value)}
[1] 4 7 8 9
私はiterpcの著者です。組込みの 'iterators'をサポートしている新しいパッケージhttps://cran.r-project.org/web/packages/arrangements/index.htmlを使いたいかもしれません。 –