2016-03-23 88 views
0

我是R新手。我寫了這個非常簡單的腳本來強調我的問題。如果我運行這個常規的循環測試數據,每次迭代都會更新,就像我想要的一樣。R:與foreach並行化

a = 5 
b = 4 
c = 3 
testdata = matrix(nrow=100, ncol=5) 
for(j in 1:100){ 
testdata[j,1] <- a*j 
testdata[j,2] <- b*j 
testdata[j,3] <- c*j 
testdata[j,4] <- (a+b)*j 
testdata[j,5] <- (a+c)*j 
} 

但是使用的foreach這個水貨版本完成的計算,但他們沒有在TESTDATA更新。

a = 5 
b = 4 
c = 3 
testdata = matrix(nrow=100, ncol=5) 
library(foreach) 
library(doParallel) 
library(doMC) 
registerDoMC() 
getDoParWorkers() # Checking the number of cores. 

foreach(j = 1:100) %dopar% { 
    testdata[j,1] <- a*j 
    testdata[j,2] <- b*j 
    testdata[j,3] <- c*j 
    testdata[j,4] <- (a+b)*j 
    testdata[j,5] <- (a+c)*j 
} 

我試圖在這裏和其他地方遵循的例子在互聯網上,但大多數的例子是R中shoptalk太深了,我跟不上。我如何使這個並行版本做非平行版本的功能。謝謝。

+0

查看'.combine'參數。 – nrussell

回答

0

您應該查看foreach包的文檔。在代碼的foreach(j = 100)部分中,您可以指定參數.combine來告訴foreach如何編譯結果。既然你想要一個5x100的數據幀/矩陣,你可以邏輯上寫出你的五個參數(即c(a*j, b*j, c*j, (a+b)*j, (a+c)*j))和rbind的一個向量來構成一個數據幀。看看下面我的代碼:

a = 5 
b = 4 
c = 3 

library(foreach) 
library(doParallel) 
library(parallel) 

## Assuming you want to use all of your cores 
registerDoParallel(cores = detectCores()) 

## Specify your .combine argument below 
foreach(j = 1:100, .combine = "rbind") %dopar% { 
    c(a*j, b*j, c*j, (a+b)*j, (a+c)*j) 
} 

而這個吐出:

  [,1] [,2] [,3] [,4] [,5] 
result.1  5 4 3 9 8 
result.2  10 8 6 18 16 
result.3  15 12 9 27 24 
result.4  20 16 12 36 32 
result.5  25 20 15 45 40 
... 

你可以通過分配這個的變量,你要那麼藉此一步:

... 
testdata <- foreach(j = 1:100, .combine = "rbind") %dopar% { 
       c(a*j, b*j, c*j, (a+b)*j, (a+c)*j) 
      } 
testdata <- as.data.frame(testdata, row.names = FALSE) 

希望這有助於!

+0

美麗!正是我需要的。謝謝! – Jericho