我正在尝试为文件夹中的多个栅格文件分配值,并将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返回实际的栅格,而不仅仅是返回整数。
答案 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)