【问题标题】:ifelse returning attempt to replicate an object of type 'S4' error in Rifelse 返回尝试在 R 中复制“S4”类型的对象错误
【发布时间】:2021-03-11 11:34:27
【问题描述】:

我正在尝试将 E raster 的值设置为 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[])

返回以下错误

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

我该如何解决这个错误?

【问题讨论】:

  • E 似乎是一个 S4 对象。这可能意味着您想更改插槽中的值。阅读help("@")
  • @Roland 使用 dE[] like E[] = ifelse(b[]&gt;0.5, 0.989+dE[], E[]) 可以消除错误。这是正确的方法吗?

标签: r if-statement r-raster


【解决方案1】:

您可以为此使用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)

【讨论】:

猜你喜欢
  • 2021-01-24
  • 2019-12-01
  • 2018-11-01
  • 2013-07-15
  • 1970-01-01
  • 2013-07-17
  • 2021-06-29
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多