【问题标题】:foreach in doParallel packagedoParallel 包中的 foreach
【发布时间】:2016-04-06 09:48:15
【问题描述】:

我有这段代码用于使用函数从一些计算中创建矩阵 for循环环境中的“cop.theta”

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,]="

我哪里错了?

【问题讨论】:

  • 如果你让你的例子可重现,它会更容易提供帮助。
  • foreach 不是这样工作的。请阅读小插曲。传递给foreach 的表达式必须有一个返回值(特别是如果您使用并行后端)。 foreach 不仅仅是for 的同义词。

标签: r foreach doparallel


【解决方案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])

应该修复这个错误。但是,请注意,只要您并行运行循环,foreach 循环内的mat.corr[i,]=... 不会将cop.theta 操作产生的值写入此特定行 - 这仅适用于单核@ 987654326@。这意味着,您必须在foreach() 内使用.combine 或在循环完成后处理合并过程。这是一个代码 sn-p 来澄清我的观点。

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

【讨论】:

    【解决方案2】:

    谢谢大家的cmets。下面的代码实际上已经回答了我的问题。

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

    【讨论】:

      猜你喜欢
      • 2016-10-11
      • 2016-10-08
      • 2021-06-10
      • 2017-09-04
      • 2016-05-09
      • 2014-01-15
      • 2020-07-13
      • 1970-01-01
      • 2020-06-07
      相关资源
      最近更新 更多