Имея большой стек растров временной серии, я хотел бы создать еще один растровый стек, который представляет 5-дневную скользящую сумму для каждого пикселя по слоям. Учитывая размер растрового стека, raster::calc работает бесконечно для этой задачи, и поэтому мне было интересно, можно ли реализовать эту операцию быстрее, используя terra::lapp. Однако:
library(terra)
stack_A<-rast(nlyrs=10)
rollsum<-function(x){data.table::frollsum(x,n=5)}
stack_B<-lapp(stack_A, fun=rollsum)
Возвращает ошибку:
"Error in (function (x) :
unused arguments (c(0, 0,...
or: [lapp] I do not like 'fun' :("
Буду признателен, если кто-нибудь подскажет, где ошибка, или, может быть, предложит другую реализацию (stars::?)
Вы можете использовать terra::app для этого; terra::app эквивалентно raster::calc. Вы пробовали terra::lapp, этот метод эквивалентен raster::overlay.
library(terra)
library(data.table)
f <- system.file("ex/logo.tif", package = "terra")
r <- rast(c(f,f,f,f))
rollsum <- function(x){data.table::frollsum(x,n=5)}
x <- app(r, rollsum)
Я не уверен, что это будет намного быстрее, так как узким местом, вероятно, является функция rollsum.
В "терре" версии 1.6-47 есть функция roll, и я ожидаю, что она будет намного быстрее.
library(terra)
#terra 1.6.47
f <- system.file("ex/logo.tif", package = "terra")
r <- rast(c(f,f,f,f))
y <- roll(r, 5, "sum", type = "to")
Большое спасибо @RobertHijmans, функция terra::roll действительно сделала это намного быстрее.