2013-01-10 26 views
7

trong khung bản đồ đất, tôi cần tính tổng số chưa xác định số số raster. Tôi cố gắng làm điều đó bằng cách sử dụng gói 'raster' và chức năng 'do.call'. Tuy nhiên, nếu hàm 'tổng hợp' có thể tổng hợp tới nhiều raster, thực hiện thao tác tương tự bằng cách sử dụng do.call dẫn đến lỗi. Tôi đang làm gì sai?tổng số lượng raster chưa xác định với gói do.call và raster

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' 

Cám ơn các bạn giúp đỡ,

François

Trả lời

8

Bạn có thể sử dụng Reduce+ để tính toán số tiền từ một danh sách:

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) 

Đối với lý do tại sao bạn doesn lệnh gốc 't làm việc, đó là hơi bối rối. Cung cấp tên hàm như một nhân vật dường như làm việc:

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) 

Nhưng điều này là không cần thiết trong bối cảnh khác:

do.call(sum,list(1,2,3)) 
[1] 6 
+0

Đó là rất hữu ích, cảm ơn! – fstevens

+0

Nó cũng đáng nói rằng, theo kinh nghiệm của tôi, Giảm là nhiều, nhanh hơn nhiều so với do.call hoặc tổng (stack (danh sách)) cho danh sách raster rất dài. –

3

Tôi không biết tại sao điều này không hoạt động (không có dấu ngoặc kép quanh sum như James chỉ ra), có lẽ đây là một lỗi (hoặc một tính năng) liên quan đến "tổng hợp" là một thành viên của nhóm Tóm tắt S4 chung chung; các thành viên khác như "max" và "prod" có cùng hành vi.

Dù bằng cách nào, nhưng thay vì

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

bạn cũng có thể làm

sum(stack(r1,r2,r3)) 

hoặc nếu bạn đã có một danh sách

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

Thật vậy, việc sử dụng ngăn xếp dường như phù hợp với "tinh thần" của gói – fstevens

Các vấn đề liên quan