2016-03-23 5 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 профессиональный жаргон, и я не мог следовать. Как я могу сделать эту параллельную версию, что делает непараллельная версия. Благодарю.

+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

 Смежные вопросы

  • Нет связанных вопросов^_^