r光栅can';t获取if-else逻辑来处理常量变量

r光栅can';t获取if-else逻辑来处理常量变量,r,r-raster,R,R Raster,我想在我的光栅砖上做一些条件逻辑。在下面的代码中,myFun1正确生成graster.out1。但是myFun2在尝试生成graster.out2时会生成错误。错误消息是 which(test)中的错误:“which”的参数不符合逻辑 除了使用值为5的变量外,这两个函数看起来完全相同。我明显遗漏了什么 library(raster) raster.in <- raster(nrows=100, ncols=100) raster.in[] <- runif(ncell(raster.

我想在我的光栅砖上做一些条件逻辑。在下面的代码中,
myFun1
正确生成
graster.out1
。但是
myFun2
在尝试生成
graster.out2
时会生成错误。错误消息是

which(test)中的错误:“which”的参数不符合逻辑

除了使用值为5的变量外,这两个函数看起来完全相同。我明显遗漏了什么

library(raster)
raster.in <- raster(nrows=100, ncols=100)
raster.in[] <- runif(ncell(raster.in), min = -10, max = 10)

const1 <- 5

myFun1 <- function(x, ...) { 
  ifelse(x <= 5, 5, x  )
}

raster.out1 <- calc(raster.in, fun = myFun1)

myFun2 <- function(x, tbase, ...) { 
  ifelse(x <= tbase, tbase, raster.in)
}
raster.out2 <- calc(raster.in, fun = myFun2(x = raster.in, tbase = const1))
库(光栅)

raster.in两个问题中,您应该在函数中使用
x
而不是
raster.in
,并且要将函数与多个参数结合起来,您需要一些额外的代码:

myFun2 <- function(x, tbase, ...) { 
  ifelse(x <= tbase, tbase, x)
}


calc(raster.in, function(x){myFun2(x, tbase = const1)})

myFun2astrofunkswag的答案是正确的,但是有更直接的方法可以通过
clamp
重新分类

r1 <- clamp(raster.in, const1)

r2 <- reclassify(raster.in, cbind(-Inf, const1, const1))

r1主题外评论,但是Robert,我们什么时候应该从raster切换到您的新软件包terra?我不能给出准确的答案,但需要努力完成功能并消除bug。我的猜测是,到8月份,用terra取代taster应该是合理的。当然,如果你早点开始,特别是在github上的开发版本,并提供反馈,这会很有帮助。clamp正是我所需要的。但是它像克雷一样在我的硬盘上运行,而根据我的活动监视器,我有6gb的可用内存。我有时在mac上使用readAll,因为它似乎做数学运算更快。在我的新线路盒上不太好用。在光栅或terra中,是否有任何隐藏的方法可以鼓励clamp更好地利用RAM?请参阅
rasterOptions
chunksize、maxmemory、Memfrac,这非常有用。我将更改默认设置,使其不那么保守。
r3 <- raster:::.ifel(raster.in < const1, const1, raster.in)