doParallel 包中的 foreach
foreach in doParallel package
我有这段代码可以使用一个函数从一些计算中创建一个矩阵
"cop.theta" 在 for 循环环境中
Mat.corr <- matrix(0,6,5,byrow=F)
for (i in 1:6){
Mat.corr[i,]=cop.theta(index,EXPR,SURV=survp[,i])
}
我使用 doParallel 包中的 "foreach" 编写了一个 R 代码,以获得与上述代码生成的结果类似的结果。我的代码如下
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,]="
我哪里错了?
byrow = F
旁边少了一个“)”,即
foreach(i=1:6,.combine=matrix(0,6,5,byrow=F)) %dopar%
Mat.corr[i,]=cop.theta(index,EXPR,QT=survp[,i])
应该可以修复此错误。但是,请注意 foreach
循环内的 mat.corr[i,]=...
不会将 cop.theta
操作产生的值写入此特定行,只要您是 运行 并行循环- 这仅适用于单核 foreach
。这意味着,您必须在 foreach()
内使用 .combine
或在循环完成后处理合并过程。这是一个代码片段来阐明我的观点。
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
谢谢大家的评论。下面的代码实际上已经回答了我的问题。
foreach(i=1:6,.combine=rbind) %dopar% cop.theta(index,EXPR,SURV=survp[,i])
我有这段代码可以使用一个函数从一些计算中创建一个矩阵 "cop.theta" 在 for 循环环境中
Mat.corr <- matrix(0,6,5,byrow=F)
for (i in 1:6){
Mat.corr[i,]=cop.theta(index,EXPR,SURV=survp[,i])
}
我使用 doParallel 包中的 "foreach" 编写了一个 R 代码,以获得与上述代码生成的结果类似的结果。我的代码如下
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,]="
我哪里错了?
byrow = F
旁边少了一个“)”,即
foreach(i=1:6,.combine=matrix(0,6,5,byrow=F)) %dopar%
Mat.corr[i,]=cop.theta(index,EXPR,QT=survp[,i])
应该可以修复此错误。但是,请注意 foreach
循环内的 mat.corr[i,]=...
不会将 cop.theta
操作产生的值写入此特定行,只要您是 运行 并行循环- 这仅适用于单核 foreach
。这意味着,您必须在 foreach()
内使用 .combine
或在循环完成后处理合并过程。这是一个代码片段来阐明我的观点。
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
谢谢大家的评论。下面的代码实际上已经回答了我的问题。
foreach(i=1:6,.combine=rbind) %dopar% cop.theta(index,EXPR,SURV=survp[,i])