r: 使用 lapply 为栅格赋值。

问题描述 投票:0回答:2

我试图为一个文件夹中的一些光栅文件赋值,并应用了 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返回实际的栅格,而不仅仅是一个整数。

r lapply raster assign
2个回答
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 "文件。这里重要的部分是 "*.ovr "文件。$ 说名字应该以.tif结尾。该 \\ 意味着你实际上想要一个 . 而不是将其作为通配符(即任何字符),这就是你正在做的事情。

f <- list.files(path="path/to/files", pattern="\\.tif$", full.names=TRUE)
© www.soinside.com 2019 - 2024. All rights reserved.