2013-01-10 5 views
7

w ramach mapowania gleby, muszę podać nieokreśloną liczbę rastrów . Próbuję to zrobić za pomocą pakietu "raster" i funkcji "do.call". Jeśli jednak funkcja "suma" może sumować się z wieloma rastrami, wykonanie tej samej operacji przy użyciu polecenia do.call prowadzi do błędu. Co ja robię źle ?Podsumowując nieokreśloną liczbę rastrów z pakietem.call i rastrowym

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' 

Dziękuję Ci pomóc,

François

Odpowiedz

8

można użyć Reduce i + obliczyć sumę z listy:

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) 

Jak, dlaczego oryginalnych robi dowodzenia Działa, to nieco kłopotliwe. Dostarczania nazwy funkcji jako postać wydaje się działać:

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) 

Ale nie jest to wymagane w innych kontekstach:

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

To było bardzo przydatne, dzięki! – fstevens

+0

Warto również wspomnieć, że z mojego doświadczenia wynika, że ​​Reduce jest znacznie, dużo szybszy niż do.call lub suma (stack (list)) dla bardzo długich list rastrowych. –

3

Nie wiem, dlaczego to nie działa (bez cudzysłowów wokół sumy jak James wskazuje), być może jest to błąd (lub funkcja) związany z "sumą" będącą członkiem grupy ogólnej S4 Summary; inni członkowie, tacy jak "max" i "prod", zachowują się tak samo.

Tak czy inaczej, ale zamiast

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

można też zrobić

sum(stack(r1,r2,r3)) 

lub jeśli masz już mieć listę

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

Rzeczywiście, używanie stosu wydaje się pasować do "ducha" paczki – fstevens

Powiązane problemy