Вы можете сделать что-то вроде этого
Пример данных
library(raster)
d <- brick(system.file("external/rlogo.grd", package="raster"))
Функция. Обратите внимание на !is.finite
. Это нужно для того, чтобы поймать случаи, когда (b1 + b3 - b2) == 0
. Когда это происходит, максимальное значение становится Inf
и результаты не годятся.
varifun <- function(b1, b2, b3){
x <- (b1 - b3) / (b1 + b3 -b2)
x[!is.finite(x)] <- NA
x
}
v <- overlay(d, fun=varifun)
Теперь вычислите минимальное и максимальное значения. Вы должны не делать это в приведенной выше функции, потому что это будет работать с фрагментами набора данных, и поэтому каждый фрагмент может иметь разные минимальные и максимальные значения. Предположительно, вы хотите, чтобы они были для всего набора данных.
vmn <- cellStats(v, "min", na.rm=TRUE)
vmx <- cellStats(v, "max", na.rm=TRUE)
А теперь объедините
vari <- 2 * ((v - vmn) / (vmx - vmn) - 0.5)
vari
#class : RasterLayer
#dimensions : 77, 101, 7777 (nrow, ncol, ncell)
#resolution : 1, 1 (x, y)
#extent : 0, 101, 0, 77 (xmin, xmax, ymin, ymax)
#crs : +proj=merc +datum=WGS84 +ellps=WGS84 +towgs84=0,0,0
#source : memory
#names : layer
#values : -1, 1 (min, max)
Кстати, сообщения, которые вы получаете из метода 1, не являются ошибками . Эти сообщения связаны с вычислением минимальных или максимальных значений только для NA
.