You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用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' :(

错误原因

  1. terra::lapp对传入函数的参数兼容性要求严格,部分版本的terra会向函数传递额外参数,而自定义的rollsum仅接受x,导致参数不匹配报错。
  2. 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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.11 06:40:53