将foreach循环的结果保存在矩阵中

时间:2013-12-20 14:28:35

标签: r foreach

我正在尝试调整for循环以并行使用它作为foreach循环。对于for循环,我创建一个空矩阵,然后用for循环生成的值填充它。但是这种方法在foreach循环中不起作用,

results<-matrix(nrow=length(classes),ncol=length(files))
dimnames(results)[[1]]<-classes
dimnames(results)[[2]]<-files

ptime<-system.time({
    foreach(z = 1:length(files),.packages="raster") %dopar% {
      raster <- raster(paste(folder,files[z],sep=""))
      data<-getValues(raster)
      clp <- na.omit(data)
      for(i in 1:length(classes)){
        results[i,z]<-length(clp[clp==classes[i]])/length(clp)
        print(z)
      }
    }
})

我的结果矩阵仍然只是填充了na,它没有填充。

z是光栅文件,i是数值类的向量。我想要每个类i的栅格z中的单元格数量,然后将其除以栅格z中的单元格总数,以获得此比例。

关于如何在foreach循环中将其保存为矩阵/数据帧的任何建议?

提前谢谢。


跟进此previous question

1 个答案:

答案 0 :(得分:2)

您还不了解foreach的工作原理。它与for循环不同。请研究包装小插曲。以下是两个简单的例子:

library(foreach)
#you need to assign the loop result
res <- foreach(z = 1:5, .combine=c) %do% {
  a <- z
  a #return value for the iterations
}

res
#[1] 1 2 3 4 5


res <- foreach(z = 1:5, .combine=cbind) %:% foreach(i = 10:13, .combine=c) %do% {
  a <- z+i
  a
}
res
#      result.1 result.2 result.3 result.4 result.5
# [1,]       11       12       13       14       15
# [2,]       12       13       14       15       16
# [3,]       13       14       15       16       17
# [4,]       14       15       16       17       18

请注意,您应该始终在没有并行化的情况下测试循环。此外,在循环中使用print没有意义。当您并行运行循环时,无论如何都不会看到打印值。