【问题标题】:r: assigning values to rasters with lapplyr:使用 lapply 为栅格赋值
【发布时间】:2020-05-08 23:01:57
【问题描述】:

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

【问题讨论】:

  • 您好nis38,如果您可以分享list.files时返回的数据(或相同形状和类似内容的虚拟数据),这样我们就可以在本地剪切和粘贴代码,这将是有帮助的并重现您的错误。当我们可以在本地运行代码时,更容易探索解决方案。谢谢:)

标签: r lapply raster assign


【解决方案1】:

你应该做的是

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)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-03-21
    • 1970-01-01
    • 1970-01-01
    • 2012-12-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多