我想做一个使用此功能的栅格叠加层,其中x和y是栅格,而Tbase是常数。
gddFunction <- function(x, y, z) {(x + y)/2 - z}
喜欢这样
library(raster)
gdd <- overlay(x = tmax_clamped, y = tmin_clamped, z = Tbase, fun = gddFunction)
我收到以下错误消息
错误(函数(x,fun,filename =“”,recycle = TRUE,forcefun =否:无法使用此公式,可能是因为它不是向量化
我尝试遵循帮助中的示例,如下所示
vgddFunction <- Vectorize(gddFunction, SIMPLIFY = FALSE)
gdd <- overlay(x = tmax_clamped, y = tmin_clamped, z = Tbase, fun = vgddFunction)
但收到相同的错误消息。
我怀疑问题是我需要z是常数值的矢量或常数值的栅格图层。但是我希望Vectorize操作能够做到这一点。
简单的地图代数,如
gdd <- (x + y)/2 - z
但是它很慢,我希望通过使用叠加来加快计算速度
raster::overlay
仅允许将raster
参数作为额外的参数通过...
传递(请参阅?overlay
)。因此,您不能直接执行当前正在执行的操作。但是我们可以避免这个问题。可重现的示例:
library(raster)
r <- raster(ncol = 10, nrow = 10)
r1 <- init(r, fun = runif)
r2 <- init(r, fun = runif)
z <- 3
您的错误:
gddFunction <- function(x, y, z) {(x + y)/2 - z}
gdd <- overlay(x = r1, y = r2, z = z, fun = gddFunction)
Error in (function (x, fun, filename = "", recycle = TRUE, forcefun = FALSE, : cannot use this formula, probably because it is not vectorized
如果我们不能直接传递z
,我们可以通过一些函数式编程间接传递它:
gddFunction2 <- function(z) {
function(x, y) (x + y) / 2 - z
}
gdd <- overlay(x = r1, y = r2, fun = gddFunction2(z))
这里,gddFunction2
将返回另一个仅具有x
和y
参数且可以采用rasters
的函数,但是您仍然可以更改常量z
,现在它是gddFunction2
的参数]。
您也可以这样写:
gddFunction <- gddFunction2(z)
gdd <- overlay(x = r1, y = r2, fun = gddFunction)
请注意,原始gddFunction
已被矢量化,因此错误消息错误地猜测了问题。