使用do.call和raster包对未确定数量的栅格进行求和

8

在土壤制图的范围内,我需要对数量不确定的栅格进行求和。我尝试使用“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'

感谢您的帮助, François
2个回答

8
您可以使用Reduce+来计算列表中的总和:
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

值得一提的是,在我的经验中,对于非常长的栅格列表,Reduce 比 do.call 或 sum(stack(list)) 快得多。 - Lucas Fortini

3

我不知道为什么这样不起作用(正如James所指出的,没有在sum周围加上引号),也许这是一个与S4摘要组通用函数相关的缺陷(或特性);其他成员如"max"和"prod"具有相同的行为。

无论如何,而不是

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

你也可以这样做。
 sum(stack(r1,r2,r3))

或者,如果您已经有一个列表

 sum(stack(list(r1,r2,r3)))

确实,使用栈似乎符合该程序包的“精神”。 - fstevens

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接