r-raster 中的 overlay 和 ifelse 函数之间的冲突
conflict between overlay and ifelse functions in r-raster
我是 运行 代码,在光栅包的 overlay
中使用 ifelse
函数时发现了一个奇怪的行为。简而言之,如果每个栅格的前 5 个值是 NA
,该函数将报错。
为什么会这样?
下面是一段模仿我使用 R 3.2.3 和光栅版本 2.5-2 发现的问题的简短代码,以及我正在考虑同时使用的一些临时解决方案。
谢谢
卡洛斯·阿尔贝罗
library(raster)
cob1d <- raster(matrix(1,nr=6,nc=6))
cob1 <- cob1d; cob2 <- cob1d; cob3 <- cob1d
overlay(cob1, cob2, cob3, fun=function(x1, x2, x3) ifelse(x1 > 0, x1 + x2 + x3, x3))
# class : RasterLayer
# dimensions : 6, 6, 36 (nrow, ncol, ncell)
# resolution : 0.1666667, 0.1666667 (x, y)
# extent : 0, 1, 0, 1 (xmin, xmax, ymin, ymax)
# coord. ref. : NA
# data source : in memory
# names : layer
# values : 3, 3 (min, max)
# Changing the first 5 values...
cob1[1:5] <- NA; cob2[1:5] <- NA; cob3[1:5] <- NA
overlay(cob1, cob2, cob3, fun=function(x1, x2, x3) (x1 + x2 + x3))
给出相同的结果...
# but if I use `ifelse`, there is a problem:
overlay(cob1, cob2, cob3, fun=function(x1, x2, x3) ifelse(x1 > 0, x1 + x2 + x3, x3))
# Error in ifelse(x1, x1 + x2 + x3, x3) :
# argument "x2" is missing, with no default
# Another way to solve it is adding a useless extra variable without `NA`.
cob4 <- cob1d
overlay(cob1, cob2, cob3, cob4, fun=function(x1, x2, x3, x4) ifelse(x1 > 0, x1 + x2 + x3, x3))
# same result as before...
# class : RasterLayer
# dimensions : 6, 6, 36 (nrow, ncol, ncell)
# resolution : 0.1666667, 0.1666667 (x, y)
# extent : 0, 1, 0, 1 (xmin, xmax, ymin, ymax)
# coord. ref. : NA
# data source : in memory
# names : layer
# values : 3, 3 (min, max)
# or just avoiding the use of the `ifelse` function...
overlay(cob1, cob2, cob3, cob4, fun=function(x1, x2, x3, x4) (x1 > 0) * (x1 + x2 + x3) + (x1 <= 0)*x3)
这是一个有趣的案例。 overlay
使用前 5 个单元格来确定如何处理数据(通过 apply
或通过 do.call
)。第一个测试是看apply
是否可以使用。如果所有值都是 NA
,则使用的函数可以是 运行 通过 apply
f <- function(x1, x2, x3) ifelse(x1 > 0, x1 + x2 + x3, x3)
m <- matrix(NA, 5, 3)
apply(m, 1, f)
根据该测试,apply
用于所有单元格。但是,当并非所有值都是 NA
:
时,apply
将无法使用此函数
m[1] <- 1
apply(m, 1, f)
这失败了,因为只有一个第一个参数 x
(不是 f
要求的三个参数)。
而 相反的 情况很常见(函数在仅提供 NA
值时失败),这种情况很少见。
raster:::calc
有参数 forcefun
来避免使用 apply
,但这在 overlay
中不可用。我已将其添加到 raster
的未来版本(版本 >= 2.5-4)中,这样你就可以:
f <- function(x1, x2, x3) ifelse(x1 > 0, x1 + x2 + x3, x3)
overlay(cob1, cob2, cob3, fun=f, forcefun=TRUE)
在任何情况下,您都可以使用 calc
作为解决方法:
s <- stack(cob1, cob2, cob3)
r <- calc(s, fun=function(x) ifelse(x[1] > 0, x[1] + x[2] + x[3], x[3]))
或基于您的替代函数的另一种选择:
r <- (cob1 > 0) * (cob1 + cob2 + cob3) + (cob1 <= 0)*cob3
也许您必须在函数中使用每个 "x" 条件,例如
overlay(cob1, cob2, cob3, fun=function(x1, x2, x3) ifelse(x1 > 0 & x2 >0 & x3 >0 , x1 + x2 + x3, x3))
不仅条件x1
(x1>0
)
我是 运行 代码,在光栅包的 overlay
中使用 ifelse
函数时发现了一个奇怪的行为。简而言之,如果每个栅格的前 5 个值是 NA
,该函数将报错。
为什么会这样?
下面是一段模仿我使用 R 3.2.3 和光栅版本 2.5-2 发现的问题的简短代码,以及我正在考虑同时使用的一些临时解决方案。
谢谢
卡洛斯·阿尔贝罗
library(raster)
cob1d <- raster(matrix(1,nr=6,nc=6))
cob1 <- cob1d; cob2 <- cob1d; cob3 <- cob1d
overlay(cob1, cob2, cob3, fun=function(x1, x2, x3) ifelse(x1 > 0, x1 + x2 + x3, x3))
# class : RasterLayer
# dimensions : 6, 6, 36 (nrow, ncol, ncell)
# resolution : 0.1666667, 0.1666667 (x, y)
# extent : 0, 1, 0, 1 (xmin, xmax, ymin, ymax)
# coord. ref. : NA
# data source : in memory
# names : layer
# values : 3, 3 (min, max)
# Changing the first 5 values...
cob1[1:5] <- NA; cob2[1:5] <- NA; cob3[1:5] <- NA
overlay(cob1, cob2, cob3, fun=function(x1, x2, x3) (x1 + x2 + x3))
给出相同的结果...
# but if I use `ifelse`, there is a problem:
overlay(cob1, cob2, cob3, fun=function(x1, x2, x3) ifelse(x1 > 0, x1 + x2 + x3, x3))
# Error in ifelse(x1, x1 + x2 + x3, x3) :
# argument "x2" is missing, with no default
# Another way to solve it is adding a useless extra variable without `NA`.
cob4 <- cob1d
overlay(cob1, cob2, cob3, cob4, fun=function(x1, x2, x3, x4) ifelse(x1 > 0, x1 + x2 + x3, x3))
# same result as before...
# class : RasterLayer
# dimensions : 6, 6, 36 (nrow, ncol, ncell)
# resolution : 0.1666667, 0.1666667 (x, y)
# extent : 0, 1, 0, 1 (xmin, xmax, ymin, ymax)
# coord. ref. : NA
# data source : in memory
# names : layer
# values : 3, 3 (min, max)
# or just avoiding the use of the `ifelse` function...
overlay(cob1, cob2, cob3, cob4, fun=function(x1, x2, x3, x4) (x1 > 0) * (x1 + x2 + x3) + (x1 <= 0)*x3)
这是一个有趣的案例。 overlay
使用前 5 个单元格来确定如何处理数据(通过 apply
或通过 do.call
)。第一个测试是看apply
是否可以使用。如果所有值都是 NA
apply
f <- function(x1, x2, x3) ifelse(x1 > 0, x1 + x2 + x3, x3)
m <- matrix(NA, 5, 3)
apply(m, 1, f)
根据该测试,apply
用于所有单元格。但是,当并非所有值都是 NA
:
apply
将无法使用此函数
m[1] <- 1
apply(m, 1, f)
这失败了,因为只有一个第一个参数 x
(不是 f
要求的三个参数)。
而 相反的 情况很常见(函数在仅提供 NA
值时失败),这种情况很少见。
raster:::calc
有参数 forcefun
来避免使用 apply
,但这在 overlay
中不可用。我已将其添加到 raster
的未来版本(版本 >= 2.5-4)中,这样你就可以:
f <- function(x1, x2, x3) ifelse(x1 > 0, x1 + x2 + x3, x3)
overlay(cob1, cob2, cob3, fun=f, forcefun=TRUE)
在任何情况下,您都可以使用 calc
作为解决方法:
s <- stack(cob1, cob2, cob3)
r <- calc(s, fun=function(x) ifelse(x[1] > 0, x[1] + x[2] + x[3], x[3]))
或基于您的替代函数的另一种选择:
r <- (cob1 > 0) * (cob1 + cob2 + cob3) + (cob1 <= 0)*cob3
也许您必须在函数中使用每个 "x" 条件,例如
overlay(cob1, cob2, cob3, fun=function(x1, x2, x3) ifelse(x1 > 0 & x2 >0 & x3 >0 , x1 + x2 + x3, x3))
不仅条件x1
(x1>0
)