如何使用Lapply在R中批量处理geoTIFF

Tia*_*Qin 2 r lapply r-raster

我有一些大型的geoTIFF,现在我想将它们转换为ASCII文件,在进行一些搜索之后,我编写了以下代码:

library(raster)

f <- list.files("inputFolder", pattern = "*.tif", full.names = TRUE)
r <- lapply(f, raster)
a <- lapply(r, writeRaster, filename = "output", format = "ascii")
Run Code Online (Sandbox Code Playgroud)

令我感到困惑的是,如何根据原始名称分别命名输出文件?

我试过了:

a <- lapply(r, writeRaster, filename = "outputFolder" + f, format = "ascii")
Run Code Online (Sandbox Code Playgroud)

但是我收到错误:

二进制运算符的非数字参数

然后我尝试了:

a <- lapply(r, writeRaster, filename = paste0(f, ".asc"), format = "ascii")
Run Code Online (Sandbox Code Playgroud)

但是我收到了:

file(filename,“ w”)中的错误:无效的'description'参数另外:警告消息:1:如果if(filename ==“”){:条件的长度> 1,则仅使用第一个元素2 :in if(!file.exists(dirname(filename))){:条件的长度> 1并且仅使用第一个元素3:In if(toupper(x @ file @ name)== toupper(filename) ){:条件的长度> 1,仅第一个元素将被使用4:In if(trim(filename)==“”){:条件的长度> 1,仅第一个元素将被使用5:In if(!file.exists(dirname(filename))){:条件的长度> 1,仅第一个元素将被使用6:in if(filename ==“”){:条件的长度> 1,且仅第一个元素将被使用7:在if(!overwrite&file.exists(filename)){中:条件的长度> 1,并且仅使用第一个元素

Phi*_*hil 5

我认为您基本上快到了那里,进行了两项更正:

首先,您需要调用writeRaster它的副作用(即,将文件写入文件系统的能力),因此无需将lapply()循环的输出分配给对象。因此,删除a <-我们有:

lapply(r, writeRaster, filename = paste0(f, ".asc"), format = "ascii")
Run Code Online (Sandbox Code Playgroud)

接下来,filename参数不会f以这种方式循环。您有两个选择,其中最简单的选择可能是使用匿名函数将@file@nameslot 传递rfilename参数:

lapply(r, function(x) {
  writeRaster(x, filename = x@file@name, format = "ascii", overwrite = TRUE)
})
Run Code Online (Sandbox Code Playgroud)

您的另一个选择是像在python中使用一样循环rf并行进行for r, f in...,可以通过以下方式完成purrr

library("purrr")
walk2(r, f, function(x, y) {
  writeRaster(x = x, filename = y, format = "ascii")
})
Run Code Online (Sandbox Code Playgroud)

在这里我们使用walk2()而不是map2()因为我们需要调用该函数以产生副作用。这遍历rf在一起,因此您可以传递一个作为要写入的对象,传递一个作为文件名。


编辑:这是我用来重现该问题的代码

library("raster")

tmp_dir = tempdir()
tmp     = tempfile(tmpdir = tmp_dir, fileext = ".zip")

download.file(
  "http://biogeo.ucdavis.edu/data/climate/cmip5/10m/cc26bi50.zip",
  destfile = tmp
)
unzip(tmp, exdir = tmp_dir)

f = list.files(tmp_dir, pattern = ".tif$", full.names = TRUE)
r = lapply(f, raster)

# Solution one
lapply(r, function(x) {
  writeRaster(x, filename = x@file@name, format = "ascii", overwrite = TRUE)
})

# solution two
library("purrr")
walk2(r, f, function(x, y) {
  writeRaster(x = x, filename = y, format = "ascii")
})
Run Code Online (Sandbox Code Playgroud)