2016-04-06 4 views
0

У меня есть этот код для создания матрицы из некоторых расчетов с использованием функции «cop.theta» в среду для контураЕогеаспа в пакете doParallel

Mat.corr <- matrix(0,6,5,byrow=F) 
for (i in 1:6){ 
Mat.corr[i,]=cop.theta(index,EXPR,SURV=survp[,i]) 
} 

Я написал код R с помощью «Еогеаспа» в doParallel package, чтобы получить результаты, похожие на то, что генерировал код. Мой код выглядит следующим образом

library(doParallel) 
cl <- makeCluster(3) 
registerDoParallel(cl) 
getDoParWorkers() 
clusterExport(cl, list("QT","EXPR","cop.theta.i")) 
clusterEvalQ(cl, library(copula)) 

foreach(i=1:6,.combine=matrix(0,6,5,byrow=F) %dopar% 
Mat.corr[i,]=cop.theta(index,EXPR,QT=survp[,i]) 

Но я получаю эту ошибку

Error: unexpected '=' in "foreach(i=1:6,.combine=matrix(0,6,5,byrow=F) 
%dopar% Mat.corr[i,]=" 

Где я буду неправильно?

+0

Если вы сделаете свой пример воспроизводимым, вам будет легче помочь. – Andrie

+0

Это не так, как работает 'foreach'. Прочтите виньетки. Выражение, переданное 'foreach', должно иметь возвращаемое значение (в частности, если вы используете параллельный бэкэнд). 'foreach' - это не просто синоним' for'. – Roland

ответ

1

Существует ")" отсутствует рядом с byrow = F, т.е.

foreach(i=1:6,.combine=matrix(0,6,5,byrow=F)) %dopar% 
    Mat.corr[i,]=cop.theta(index,EXPR,QT=survp[,i]) 

исправить эту ошибку. Однако имейте в виду, что mat.corr[i,]=... внутри цикла foreach не будет записывать значения, полученные в результате операции cop.theta, в эту конкретную строку при условии, что вы выполняете цикл параллельно - это возможно только с одноядерным foreach. Это означает, что вы должны обрабатывать процедуру слияния либо с использованием .combine внутри foreach(), либо после того, как цикл завершен. Вот фрагмент кода, чтобы прояснить мою точку зрения.

mat <- matrix(nrow = 3, ncol = 3) 

### multi-core ----- 
foreach(i = 1:nrow(mat)) %dopar% { 
    mat[i, ] <- matrix(rep(i, ncol(mat)), nrow = 1) 
} 

mat 
    [,1] [,2] [,3] 
[1,] NA NA NA 
[2,] NA NA NA 
[3,] NA NA NA 


### single core ----- 
foreach(i = 1:nrow(mat)) %do% { 
    mat[i, ] <- matrix(rep(i, ncol(mat)), nrow = 1) 
} 

mat 
    [,1] [,2] [,3] 
[1,] 1 1 1 
[2,] 2 2 2 
[3,] 3 3 3 
0

Спасибо всем за ваши комментарии. Следующий код действительно ответил на мой вопрос.

foreach(i=1:6,.combine=rbind) %dopar% cop.theta(index,EXPR,SURV=survp[,i])