ifelse 返回尝试在 R 中复制“S4”错误类型的对象

问题描述

我试图将 E 栅格的值设置为 0.987,其中 b 大于 0.5,否则使用 E​​ 中的任何值。为此,我使用以下代码

a <- raster::raster(ncol=100,nrow=100)
set.seed(2)
raster::values(a) = runif(10000,min=0.1,max=0.4)
b <- raster::raster(ncol=100,nrow=100)
set.seed(2)
raster::values(b) = runif(10000,min=0.02,max=0.8)

c <- ((b - 0.2)/(0.5 - 0.2))^2
dE <- (1 - 0.9747)*(1 - c)*0.55*0.9896
E <- raster::raster(b)
E[] = ifelse(b[]>0.5,0.989+dE,E[])

它返回我以下错误

代表错误(是的,length.out = len): 尝试复制“S4”类型的对象

我该如何解决这个错误

解决方法

您可以为此使用 terra::ifel

library(terra)
set.seed(2)
a <- rast(ncols=10,nrows=10)
values(a) = runif(100,min=0.1,max=0.4)
b <- setValues(a,runif(100,min=0.02,max=0.8))    
c <- ((b - 0.2)/(0.5 - 0.2))^2    
dE <- (1 - 0.9747)*(1 - c) * 0.55 * 0.9896 + 0.989

E <- ifel(b>0.5,dE,b)

这相当于

x <- mask(dE,b>0.5,maskvalues=0)
e <- cover(x,b)

plot(e,E); abline(0,1)