如何强制循环不计算以前的文件?

时间:2015-01-27 09:48:08

标签: r for-loop

我在两个文件夹MEANfilesEAN中有数千个文件(作为矩阵)。这些文件具有相同的尺寸

我想简单地总结每两个文件并创建第三个文件

File1 (first folder)+ file2(corresponding file from the second folder)=file3

代码工作正常,但我注意到循环计算了一些文件,然后将它们放在输出中,然后使用其他文件计算相同的文件并将所有文件放在输出中,并且这样做....循环不会通过文件和计算获取一个文件,但每次计算它都会返回以前的文件。如果我有一些文件,但有数千个文件这是一个问题,这很好!

代码:

 dir1<- list.files("/donne/MEANfiles", "*.bin", full.names = TRUE)

 results <- list()
for (files in seq_along(dir1)){


for (i in seq_along(results)){
}

1 个答案:

答案 0 :(得分:3)

一种方法是同时循环两个文件名列表,例如使用mapply,使用raster读取两个栅格,将它们相加,然后再将它们吐出来:

library(raster)
mapply(function(x, y) {
  z <- raster(x) + raster(y)
  writeRaster(z, file.path(outputDir, basename(x)), format='HFA')
}, dir1, dir2)

在这里,我使用了format='HFA',它对应于Erdas Imagine(我假设这是你开始使用.img扩展时的光栅格式)。根据需要更改格式(请参阅?writeFormats)。

我不确定,但是创建两个文件列表的RasterStack个子集可能会更快,将它们相加并写出结果堆栈的和栅格。有点像...

library(raster)
i <- rep(1:10, length.out=length(dir1)) # edit 10 to reflect your memory capacity
dir1 <- split(dir1, i)
dir2 <- split(dir2, i)
mapply(function(x, y) {
  z <- stack(x) + stack(y)
  writeRaster(z, file.path(outputDir, basename(x)), format='HFA', bylayer=TRUE)
}, dir1, dir2)