r - r raster 如何矢量化函数以与叠加层一起使用
问题描述
我想做一个使用此函数的栅格叠加,其中 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)
我收到以下错误消息
(function (x, fun, filename = "", recycle = TRUE, forcefun = FALSE, : 不能使用这个公式,可能是因为它没有矢量化
我尝试按照帮助中的示例进行操作,如下
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
andy
参数,可以接受rasters
,但您仍然可以更改常量z
,它现在是 的参数gddFunction2
。
你也可以这样写:
gddFunction <- gddFunction2(z)
gdd <- overlay(x = r1, y = r2, fun = gddFunction)
请注意,您的原件gddFunction
已经矢量化,因此错误消息会错误地猜测问题。
推荐阅读
- devexpress - DevExpress XAF 中的自定义属性
- excel - 如何优化 Excel 中的单元格范围选择?
- django - 不要将此请求 http 保存在 django 的数据库中
- python - 检查列表最后几个位置的每个元素是否在另一个列表中
- apache-spark - spark-submit 抛出:错误 SparkContext:91 - 初始化 SparkContext 时出错。java.lang.NullPointerException
- android - OkHttp 泄露与 googleads.g.doubleclick.net 的连接
- c++ - 从另一个函数中删除动态数组
- firebase - Google 2FA 的 Firebase SDK 身份验证问题
- ios12 - 如何为 CALayer 的位置设置动画?
- java - Web服务获取Json