我试图为一个文件夹中的一些光栅文件赋值,并应用了 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返回实际的栅格,而不仅仅是一个整数。
你应该做的是
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 "文件。这里重要的部分是 "*.ovr "文件。$
说名字应该以.tif结尾。该 \\
意味着你实际上想要一个 .
而不是将其作为通配符(即任何字符),这就是你正在做的事情。
f <- list.files(path="path/to/files", pattern="\\.tif$", full.names=TRUE)