Несколько входных имен файлов в качестве выходных имен файлов в R - PullRequest
0 голосов
/ 08 ноября 2018

Я пытаюсь обработать несколько тысяч изображений GeoTIFF в R с помощью простой операции вычисления (преобразование температуры из Кельвина в градусы Цельсия) из растрового пакета.

Расчет работает, но мне нужны исходные имена входных файлов в качестве выходных для последующего назначения изображений.

С моим текущим кодом берется только первое имя файла в списке, и выходной файл постоянно перезаписывается.

Полный список файлов с путем использования 'calc':

library(raster)

files <- list.files(path="myInputPath", 
                  pattern="1km.tif$", 
                  full.names=T)

Список имен файлов без пути к имени выходных данных:

filenames <- list.files(path="myInputPath", 
                        pattern="1km.tif$", 
                        full.names=F)

Два цикла для обработки данных и присвоения имени выводу:

for(j in seq(filenames)){
  for(i in seq(files)){
    celsius <- calc(x=raster(files[i]), fun=function(x){x*0.02-273.15})
    writeRaster(celsius, 
              filename=paste0("myOutputPath",#path where the data should be stored
                            filenames[j],#filenames from list
                            "_celsius",#suffix to distinguish from input data
                            ".tif"),
                            overwrite=T)
  }
}

1 Ответ

0 голосов
/ 08 ноября 2018

Ой, ты понимаешь, что заново обрабатываешь каждый из своих файлов столько раз, сколько у тебя есть файлов? То есть внутренняя часть двух циклов выполняется i^j раз (что составляет i^2), хотя вам нужно только выполнить i раз.

Как насчет этого (на самом деле не проверено):

infiles <- list.files(path="myInputPath", 
                      pattern="1km.tif$", 
                      full.names=TRUE)
outfiles <- file.path("myOutputPath", paste0(basename(infiles), "_celsius.tif"))
for (j in seq_along(infiles)) {
    celsius <- calc(x=raster(infiles[j]), fun=function(x) x*0.02-273.15)
    writeRaster(celsius, filename=outfiles[j], overwrite=TRUE)
}
...