光栅如何矢量化要与覆盖一起使用的函数

问题描述 投票:0回答:1

我想做一个使用此功能的栅格叠加层,其中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

但是它很慢,我希望通过使用叠加来加快计算速度

r r-raster
1个回答
2
投票

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将返回另一个仅具有xy参数且可以采用rasters的函数,但是您仍然可以更改常量z,现在它是gddFunction2的参数]。

您也可以这样写:

gddFunction <- gddFunction2(z)
gdd <- overlay(x = r1, y = r2, fun = gddFunction)

请注意,原始gddFunction已被矢量化,因此错误消息错误地猜测了问题。

© www.soinside.com 2019 - 2024. All rights reserved.