2017-08-28 4 views
0

R(foreach + doParallelパッケージ)で "foreach"ループを使いたいのですが、私の仕事でループがいくつかのNAを返し、古典的な "for"ループが値を返します私がしたい:rでforeachループを使うNAを返す

library(foreach) 
    library(doParallel) 

    ncore=as.numeric(Sys.getenv('NUMBER_OF_PROCESSORS'))-1 
    registerDoParallel(cores=ncore) 

    B=2 

    a = vector() 
    b = vector() 

    foreach(i = 1:B, .packages = "ez",.multicombine = T,.inorder = T, .combine = 'c')%dopar%{ 
     a[i] = i + 1 
     return(a) 
    } 

    for(i in 1:B){ 
     b[i] = i + 1 
     b 
     } 

あなたがオブジェクト「b」は2と3を(それは私が欲しいものです)を返しながら、「」2、NAとのベクトルを返し、3、オブジェクト、それをしようとした場合、あなたが見ることができるように。

「NA」は私の結果でありますなぜ私は実際にforeachがグローバルオブジェクトaは変更されませんので、これはある...

+1

foreachループのretrunは 'i = 1、a = c(2)'ですが、 'i = 2'は' a = c(NA、3) 'です。単一のループごとに空です。 forループ内では、2回目に呼び出されても、それはもはや空ではありません。したがって、 '.combine'ではc(2、NA、3)に加算されます。 –

+0

すぐにお返事ありがとうございます!それがどのように動作するのか理解しやすくなりました! – Rhevan

答えて

2

を理解することはできません。 listと組み合わせてみてください。何が起こっているのかを理解することは容易になります。私はBから3に増えました。

> B=3 
> 
> a = vector() 
> 
> foreach(i = 1:B, .multicombine = T, .inorder = T, .combine = 'list') %dopar% { 
+ a[i] = i + 1 
+ return(a) 
+ } 
[[1]] 
[1] 2 

[[2]] 
[1] NA 3 

[[3]] 
[1] NA NA 4 

我々は、各反復において空ベクターaがとられ、それのいずれかの値が満たされていることがわかります。 cの結果を組み合わせると、NAという値が得られます。

> foreach(i = 1:B, .multicombine = T, .inorder = T, .combine = 'c') %dopar% { 
+ a[i] = i + 1 
+ return(a) 
+ } 
[1] 2 NA 3 NA NA 4 

この例では、これを行うことができます。

> a <- foreach(i = 1:B, .multicombine = T, .inorder = T, .combine = 'c') %dopar% { 
+ i + 1 
+ } 
> a 
[1] 2 3 4 
+0

ありがとうございました! "foreach"ループがどのように動作するかを理解しています。私はもっと複雑な作業でこれを使用します(これは何が起こっているのかを理解しようとしたものです)。 – Rhevan

0

foreachよりlapplyのようなforループよりも動作します。あなたは、単にforeach(i = 1:B, .combine = 'c') %dopar% { i + 1 } 行うことができます

.multicombine.inorderはすでにTRUEですが、あなたは高い値に.maxcombineを設定することもできます)。

関連する問題