7

在土壤测绘框架中,我需要对未确定数量的栅格求和。我尝试使用 'raster' 包和 'do.call' 函数来做到这一点。但是,如果 'sum' 函数可以对多个栅格进行求和,则使用 do.call 执行相同的操作会导致错误。我究竟做错了什么 ?

library(raster)

r1 <- raster(ncol=10, nrow=10)   # dataset for test
values(r1) <- runif(ncell(r1))
r2 <- raster(ncol=10, nrow=10)
values(r2) <- runif(ncell(r2))
r3 <- raster(ncol=10, nrow=10)
values(r3) <- runif(ncell(r3))

sum(r1,r2,r3)    # works nice

do.call(sum,list(r1,r2,r3))

##Erreur dans as.character(sys.call()[[1L]]) : 
##cannot coerce type 'builtin' to vector of type 'character'

谢谢你的帮助,

弗朗索瓦

4

2 回答 2

8

您可以使用Reduceand+从列表中计算总和:

Reduce("+",list(r1,r2,r3))
class       : RasterLayer 
dimensions  : 10, 10, 100  (nrow, ncol, ncell)
resolution  : 36, 18  (x, y)
extent      : -180, 180, -90, 90  (xmin, xmax, ymin, ymax)
coord. ref. : +proj=longlat +datum=WGS84 
data source : in memory
names       : layer 
values      : 0.4278222, 2.476625  (min, max)

至于为什么您的原始命令不起作用,这有点令人困惑。将函数名称作为字符提供似乎可行:

do.call("sum",list(r1,r2,r3))
class       : RasterLayer 
dimensions  : 10, 10, 100  (nrow, ncol, ncell)
resolution  : 36, 18  (x, y)
extent      : -180, 180, -90, 90  (xmin, xmax, ymin, ymax)
coord. ref. : +proj=longlat +datum=WGS84 
data source : in memory
names       : layer 
values      : 0.4278222, 2.476625  (min, max)

但这在其他情况下不是必需的:

do.call(sum,list(1,2,3))
[1] 6
于 2013-01-10T15:25:41.027 回答
3

我不知道为什么这不起作用(正如詹姆斯指出的那样,在 sum 周围没有引号),也许这是与“sum”作为 S4 Summary group generic 的成员相关的错误(或功能);其他成员,例如“max”和“prod”具有相同的行为。

无论哪种方式,但不是

 do.call("sum", list(r1,r2,r3))

你也可以

 sum(stack(r1,r2,r3))

或者如果你已经有一个列表

 sum(stack(list(r1,r2,r3)))
于 2013-01-15T05:52:59.927 回答