2013-01-10 84 views
7

在土壤映射的框架中,我需要總結一個未定的柵格數。我嘗試使用'raster'包和'do.call'函數來做到這一點。但是,如果'sum'函數可以總結爲多個柵格,則使用do.call執行相同的操作會導致錯誤。我究竟做錯了什麼 ?求和一個未定數的柵格與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' 

謝謝你的幫助,

弗朗索瓦

回答

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 
+0

這是非常有用的,謝謝! – fstevens

+0

值得一提的是,根據我的經驗,Reduce比非常長的柵格列表的do.call或sum(stack(list))要快得多,速度要快得多。 –

3

我不知道爲什麼,這並不工作(沒有和周圍的報價James指出),也許這是一個與「sum」是S4 Summary小組通用成員有關的bug(或特徵);其他成員如「max」和「prod」具有相同的行爲。的

無論哪種方式,而是

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

你也可以做

sum(stack(r1,r2,r3)) 

,或者如果你已經有一個列表

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

確實,使用堆棧似乎符合軟件包的「精神」 – fstevens