【问题标题】:Save results of foreach loop in a matrix将 foreach 循环的结果保存在矩阵中
【发布时间】:2014-01-09 10:39:58
【问题描述】:

我正在尝试调整 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

【问题讨论】:

    标签: r foreach


    【解决方案1】:

    您还没有理解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 也没有任何意义。当您并行运行循环时,无论如何您都不会看到打印的值。

    【讨论】:

    • 感谢您的建议。我一直在阅读 cran 文档,但我无法将我正在做的事情与给出的示例联系起来。我目前正在单核上尝试我的代码,只是尝试调试代码。
    猜你喜欢
    • 2015-02-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-22
    相关资源
    最近更新 更多