r растр как векторизовать функцию для использования с наложением - PullRequest
0 голосов
/ 28 мая 2020

Я хочу сделать растровое наложение, использующее эту функцию, где 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 был вектором постоянных значений или, возможно, растровым слоем постоянных значений. Но я надеялся, что операция векторизации сделает это.

Простая алгебра карт работает, как в

gdd <- (x + y)/2 - z

, но она медленная, и я надеялся ускорить вычисление с помощью наложения

1 Ответ

2 голосов
/ 29 мая 2020

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 уже векторизован, поэтому ошибка сообщение неверно угадывает проблему.

...