Искам да изчислим всеки елемент в горната триъгълна матрица като използваме foreach
функция
library(foreach)
library(doParallel)
cl <- makeCluster(2)
registerDoParallel(cl)
tempdata <- matrix(0, nrow = 10, ncol = 10)
tempdata2 <- matrix(0, nrow = 10, ncol = 10)
foreach (i = 1:9, .combine="rbind") %do% {
for (j in (i+1):10) {
tempdata[i, j] <- i+j;
tempdata2[i, j] <- i*j
}
}
работи, когато използвам %do%
, но когато използвам% dopar% получавам нищо. Какво правя погрешно? Благодаря ви момчета. Всяко предложение ще бъде оценено.
Отговори:
1 за отговор № 1Не можете да променяте променливите, дефинирани извън foreach
и очакваме данните да бъдат изпратени обратно към главния процес. for
примки позволяват този вид страничен ефект, но тойне работи в паралелни изчисления, освен ако работниците не са нишки в рамките на един и същ процес, и това не се поддържа от никой от пакетите за R паралелна обработка, защото R е с една нишка.
Вместо това трябва да върнете стойност от тялото на foreach
и комбинирайте тези стойности, за да получите желания резултат. Във вашия случай ще изчислите две стойности за една итерация на foreach
цикъл, така че трябва да ги включите в списък, което означава, че се нуждаете от по-сложна функция за комбиниране. Ето един начин да го направите:
library(doParallel)
cl <- makeCluster(2)
registerDoParallel(cl)
comb <- function(...) {
mapply(rbind, ..., SIMPLIFY=FALSE)
}
r <- foreach(i=1:9, .combine="comb", .multicombine=TRUE) %dopar% {
tmp <- double(10)
tmp2 <- double(10)
for(j in (i+1):10) {
tmp[j] <- i+j
tmp2[j] <- i*j
}
list(tmp, tmp2)
}
tempdata <- r[[1]]
tempdata2 <- r[[2]]