使用terra::lapp计算时序栅格5天滚动求和报错,求解决方案
时序栅格栈5天滚动求和实现问题
问题背景
有大型时序栅格栈,需要为每个像素计算各图层上的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' :(
错误原因
terra::lapp对传入函数的参数兼容性要求严格,部分版本的terra会向函数传递额外参数,而自定义的rollsum仅接受x,导致参数不匹配报错。data.table::frollsum的返回值可能存在类型或属性问题,与terra的预期输出格式不兼容。
解决方案
方案一:使用terra::roll(推荐,效率最优)
terra内置了专门的滚动窗口计算函数roll,针对时序栅格优化,无需手动处理像素级向量:
library(terra) # 构造测试栅格(替换为你的实际栅格) stack_A <- rast(nlyrs = 10, vals = rnorm(10*10*10)) # 5天滚动求和,默认右对齐,边界补NA stack_B <- roll(stack_A, k = 5, fun = sum) # 若需要左对齐或居中对齐,可设置align参数:align="left"/"center" # stack_B <- roll(stack_A, k=5, fun=sum, align="left")
方案二:修正lapp调用逻辑
调整自定义函数,兼容terra可能传递的额外参数,并确保返回标准数值向量:
library(terra) library(data.table) stack_A <- rast(nlyrs = 10, vals = rnorm(10*10*10)) rollsum <- function(x, ...) { # 接收额外参数,转换返回值为标准numeric向量 as.numeric(frollsum(x, n = 5)) } stack_B <- lapp(stack_A, fun = rollsum)
方案三:使用stars包实现
适合熟悉tidyverse语法的用户,通过st_apply处理像素级时间序列:
library(stars) library(data.table) # 将terra栅格转换为stars对象 stack_A <- st_as_stars(rast(nlyrs = 10, vals = rnorm(10*10*10))) # 对每个像素(空间维度1、2)应用滚动求和 stack_B <- st_apply(stack_A, MARGIN = c(1,2), FUN = function(x) frollsum(x, n=5)) # 可选:转换回terra栅格格式 stack_B_rast <- rast(stack_B)
内容的提问来源于stack exchange,提问作者tabumis
相关产品推荐
相关产品推荐

