我正在尝试调整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循环中将其保存为矩阵/数据帧的任何建议?
提前谢谢。
答案 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
没有意义。当您并行运行循环时,无论如何都不会看到打印值。