r:使用lapply为栅格分配值

时间:2020-05-08 23:01:57

标签: r lapply raster assign

我正在尝试为文件夹中的多个栅格文件分配值,并将raster()函数应用于它们,最终目的是对它们进行绘图,堆叠和代数处理。因此,该文件夹中的每个光栅文件都将分配给“ r1”,“ r2”等。到目前为止,我有:

f <- list.files(path="path/to/files", pattern="*.tif", full.names=TRUE, recursive=FALSE)

head(f)

[1] "path/to/files/wc2.1_2.5m_prec_1970-01.tif"    
[2] "path/to/files/wc2.1_2.5m_prec_1970-01.tif.ovr"
[3] "path/to/files/wc2.1_2.5m_prec_1970-02.tif"    
[4] "path/to/files/wc2.1_2.5m_prec_1970-02.tif.ovr"
[5] "path/to/files/wc2.1_2.5m_prec_1970-03.tif"    
[6] "path/to/files/wc2.1_2.5m_prec_1970-03.tif.ovr"

r <- lapply(f, raster)
lapply(r, function(i){
  assign(paste0("r", i), i)
})

但是,如果我返回r1,它只会给出以下输出:

> r1
[1] 1

我不太确定如何确保r返回实际的栅格,而不仅仅是返回整数。

1 个答案:

答案 0 :(得分:0)

您应该做的是

f <- list.files(path="path/to/files", pattern="\\.tif$", full.names=TRUE)
library(raster)
s <- stack(f)

现在要问的问题是:无论您做什么,都不要使用assign。认为您需要它是一个常见的初学者错误。它很少有很好的用途---并且您可能永远不需要它。使用它会导致可怕的代码,其中包含您按名称调用的许多对象。

您应该做什么取决于接下来发生的事情,您没有告诉我们(但这可能是我在上面显示的内容)。通常,如果要使用名称,可以为列表的元素命名

names(r) <- paste0("r", 1:length(r))

但这可能会更有帮助

names(r) <- gsub(".tif", "", basename(f))

如果图层具有相同的范围和分辨率,请制作一个RasterStack并命名图层(但是,如上所示,您应该对文件名使用stack

s <- stack(r)
names(s) <- paste0("r", 1:nlayers(s))

此外,在list.files中,您应该使用pattern="\\.tif$"来不包括“ * .ovr”文件。这里最重要的部分是$,它表示名称应以.tif结尾。 \\意味着您实际上要使用.,而不要将它用作通配符(即任何字符)。

f <- list.files(path="path/to/files", pattern="\\.tif$", full.names=TRUE)