1

我有一个关于app()家庭功能的简单问题

我想将一个向量(n个值)除以一个栅格并得到n个结果栅格

s <- rast(system.file("ex/logo.tif", package="terra"))[[1]] 

lapp(s, aa = c(1, 10, 100, 1000), function(x, aa){0.46 * aa/(x + 1)})

同样想知道如何使用 SpatRasterDataset。那可能吗?

这是一个例子:

fun = function(i, j) { 
    v <- c(1, 10, 100, 1000)
    f <- i + j
    v / f
}
srd <- sds(list(i = s, j = s/10))
r <- lapp(srd, fun = fun, recursive = TRUE )
4

1 回答 1

1

您可以这样做(使用稍作修改的示例以更容易查看发生的情况):

library(terra)
s <- rast(ncols=10, nrows=10)
s <- init(s, 1:10)
v <- c(1, 10, 100, 1000)    
a <- app(s, function(x, aa){ sapply(aa, function(i) 2 * i/x) }, aa=v)
a
#class       : SpatRaster 
#dimensions  : 10, 10, 3  (nrow, ncol, nlyr)
#resolution  : 36, 18  (x, y)
#extent      : -180, 180, -90, 90  (xmin, xmax, ymin, ymax)
#coord. ref. : +proj=longlat +datum=WGS84 +no_defs 
#source      : memory 
#names       : lyr.1, lyr.2, lyr.3 
#min values  :   0.2,   2.0,  20.0 
#max values  :     2,    20,   200 

使用terra1.3-17 版(目前是开发版),您现在还可以执行以下操作:

b <- 2 * v/s

得到相同的结果。当使用比层数长的向量进行算术运算时,SpatRaster 的层会被回收。

使用 SpatRasterDataSet,您可以执行以下操作。fun在外部进行测试lapp以查看返回的值的数量及其顺序是否有意义是很重要的。

fun = function(i, j) { 
    v <- c(1, 10, 100, 1000)
    f <- i + j
    f <- rep(f, each=length(v))
    matrix(v / f, ncol=length(v), byrow=TRUE)
}
srd <- sds(list(i = s, j = s/10))
r <- lapp(srd, fun = fun)
于 2021-07-24T09:21:02.660 回答