Передискретизация нескольких растров с помощью цикла for

Я пытаюсь зациклить функцию передискретизации некоторых растров, которые у меня есть в списке, чтобы их размеры, экстент и разрешение соответствовали первому растру в списке. Но я продолжаю получать следующую ошибку

Ошибка в (function (classes, fdef, mtable): невозможно найти унаследованный метод для функции 'resample' для сигнатуры '"list", "RasterLayer"'

Ниже мой код:

      library(raster)
rastlist <- list.files(path = ".", pattern='.tif$',
all.files=T, full.names=F)
allrasters <- lapply(rastlist, raster)
nrasters <- length(allrasters)
raster_standard <- allrasters[[1]]
r<-allrasters[i]
for (i in 1:nrasters) {
rs<-resample(r,raster_standard, method='bilinear')
}

Я нашел несколько похожих тем, но не думаю, что делаю те же ошибки, поэтому не уверен, что решения помогут мне. Любая помощь, которую вы можете предоставить, будет высоко оценена.

1 ответ

У вас были следующие ошибки

  1. Вы использовали allrasters[i] вне цикла
  2. вам нужно использовать двойные скобки для извлечения чего-либо из списка, как в allrasters[[i]] --- при использовании одинарных скобок будет сгенерировано сообщение об ошибке, о котором вы сообщаете, как если бы вы пытались использовать resample с list вместо RasterLayer
  3. Внутри цикла вы перезаписываете ту же переменную rsтак что вы можете сделать только последнюю итерацию. Вместо этого добавьте растры в список
  4. Вы передискретизируете первый растр с самим собой. Это не так , но в этом нет смысла

Ниже работает

      library(raster)
#ff <- list.files(pattern='\\.tif$')
# to make this reproducible
f <- system.file("external/test.grd", package="raster")    
ff <- rep(f, 3)

rr <- lapply(ff, raster)

standard <- rr[[1]]

rs <- list(standard)
for (i in 2:length(rr)) {
    rs[[i]] <- resample(rr[[i]], standard, method='bilinear')
}

s <- stack(rs)

Для более быстрой передискретизации вы можете попробовать terra

      library(terra)
rr <- lapply(ff, rast)
standard <- rr[[1]]

rs <- list(standard)
for (i in 2:length(rr)) {
    rs[[i]] <- resample(rr[[i]], standard, method='bilinear')
}

s <- rast(rs)
Другие вопросы по тегам