我有一些大的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")
让我感到困惑的是,如何根据原始名称分别命名输出文件?
我试过了:
a <- lapply(r, writeRaster, filename = "outputFolder" + f, format = "ascii")
但我收到了错误:
二元运算符的非数字参数
然后我尝试了:
a <- lapply(r, writeRaster, filename = paste0(f, ".asc"), format = "ascii")
但我收到了:
文件错误(文件名,“w”):无效的'description'参数In 另外:警告消息:1:在if(filename ==“”){: 条件的长度> 1,只使用第一个元素2:In if(!file.exists(dirname(filename))){:条件有长度&gt; 1,只使用第一个元素3:在if中 (toupper(x @ file @ name)== toupper(filename)){:条件有 长度> 1,只使用第一个元素4:在if中 (trim(filename)==“”){:条件有长度&gt; 1而且只有 第一个元素将被使用5:在if(!file.exists(dirname(filename))) {:条件长度> 1,只有第一个元素 used 6:in if(filename ==“”){:条件长度&gt; 1和 只使用第一个元素7:In if(!overwrite&amp; file.exists(filename)){:条件有长度&gt; 1而且只有 将使用第一个元素
答案 0 :(得分:2)
我认为你基本上就在那里,有两处更正:
首先,您正在调用writeRaster
的副作用(即将文件写入文件系统的能力),因此您无需分配{{1}的输出循环到一个对象。所以,删除lapply()
我们有:
a <-
接下来,lapply(r, writeRaster, filename = paste0(f, ".asc"), format = "ascii")
参数不会以这种方式循环遍历filename
。您有两个选项,其中最简单的可能是使用匿名函数将f
@file@name
插槽传递给r
参数:
filename
您的另一个选择是并行lapply(r, function(x) {
writeRaster(x, filename = x@file@name, format = "ascii", overwrite = TRUE)
})
和r
,就像使用f
的python一样,可以使用for r, f in...
完成:
purrr
我们在这里使用library("purrr")
walk2(r, f, function(x, y) {
writeRaster(x = x, filename = y, format = "ascii")
})
而不是walk2()
,因为我们需要为副作用调用该函数。这会一起遍历map2()
和r
,因此您可以传递一个作为要写入的对象,一个作为文件名。
编辑:这是我用来重现问题的代码
f
答案 1 :(得分:1)
要测试如何使用小文件执行此操作:
library(raster)
s <- stack(system.file("external/rlogo.grd", package="raster"))
writeRaster(s, file='testtif', format='GTiff', bylayer=T, overwrite=T)
f <- list.files(pattern="testtif_..tif")
现在,您可以将f
与Phil的好例子结合使用。您还可以将所有步骤合并到一起:
f <- list.files("inputFolder", pattern = "*.tif", full.names = TRUE)
r <- lapply(f, function(i) { writeRaster(raster(i), filename=extension(i, '.asc'), overwrite=TRUE)} )
但是如果你有lapply的麻烦,写一个循环(没关系!):
for (i in 1:length(f)) {
r <- raster(f[i])
ff <- extension(f[i], '.asc')
writeRaster(r, ff)
}
或者像这样
for (file in f) {
r <- raster(file)
ff <- extension(file, '.asc')
writeRaster(r, ff)
}