在循环中创建栅格砖时出错

时间:2017-09-19 14:21:07

标签: r loops for-loop stack raster

我正在处理时间序列的栅格,我需要分析17个日期的ts。对于每个日期,我导入了5频段和7频段。我列出了17个频段-5和17个频段-7的列表,分别称为list_B5和list_B7。 我想将相同日期的波段叠加在一起,所以:list_B5的第一个栅格,其中第一个栅格为list_B7; list_B5的第二个栅格,其中第二个栅格为list_B7;等等。

我是循环的新手,但我试着写一个:

    for (i in seq_along(length(list_B5)) [1]) {
      for (j in seq_along(length(list_B7)) [2]) {
        B5 <- raster(list_B5[[i]]) #extract the raster of interest
        B7 <- raster(list_B7[[j]]) #extract the raster of interest
        test[i,j] <- brick(B5, B7) #stack them together
      }
    }

以“test”为:

test <- brick(nrows=5490, ncol=5490, nl=17)

不幸的是我收到以下错误:

Error in (function (classes, fdef, mtable)  : 
unable to find an inherited method for function ‘raster’ for signature ‘"NULL"’

我不明白为什么它不接受我尝试提取感兴趣的栅格的行,因为这条线通常可以工作:

> raster(list_B5[[3]])
class       : RasterLayer 
dimensions  : 5490, 5490, 30140100  (nrow, ncol, ncell)
resolution  : 20, 20  (x, y)
extent      : 6e+05, 709800, 5590200, 5700000  (xmin, xmax, ymin, ymax)
coord. ref. : +proj=utm +zone=31 +datum=WGS84 +units=m +no_defs +ellps=WGS84 +towgs84=0,0,0 

有人可以向我解释为什么我会收到上述错误吗?

1 个答案:

答案 0 :(得分:1)

为什么代码被破坏

seq_along(length(list_B5))没有按照您的预期行事。相反,它只返回1。您需要使用seq_along(list_B5)seq_len(length(list_B5))。查看文档以获取信息。

稍后,您将1分组到其第二个元素:seq_along(length(list_B7))[2]。这会引入NA,这会在以后导致问题。

您可以自行调试这些问题,方法是测试部分代码以查看它们是否产生预期结果。例如,运行seq_along(length(list_B5))[1]seq_along(length(list_B7))[2],看看它们是否生成了您希望的序列。

更简单的方式

使用mapply执行此操作可能最简单。

list_b5 <- replicate(17, raster(matrix(runif(12), ncol=3)))
list_b7 <- replicate(17, raster(matrix(runif(12), ncol=3)))

mapply(stack, list_b5, list_b7)

此处mapply同时循环list_b5list_b7的元素,并应用stack函数(如果您愿意,请替换为brick。)< / p>

如果您的列表实际上是文件路径,那么您可以执行以下操作:

list_b5 <- replicate(17, raster(matrix(runif(12), ncol=3)))
list_b7 <- replicate(17, raster(matrix(runif(12), ncol=3)))

mapply(function(x, y) stack(raster(x), raster(y)), list_b5, list_b7)

修复方法

以下是使用for循环执行此操作的方法:

test <- list(length=17)
for (i in seq_along(list_b5)) {
    b5 <- list_b5[[i]]
    b7 <- list_b7[[i]]
    test[[i]] <- stack(b5, b7)
}

或者如果您的列表是文件路径,

test <- list(length=17)
for (i in seq_along(list_b5)) {
    b5 <- raster(list_b5[[i]])
    b7 <- raster(list_b7[[i]])
    test[[i]] <- stack(b5, b7)
}