2013-03-08 3 views
9

Potrzebuję stworzyć kilka mozaik rastrowych. Korzystam z pakietu raster w wersji 2.0-31 na komputerze z 64-bitowym systemem Windows. Uważam, że wykonałem zadanie domowe sprawdzając wszystkie możliwe blogi i zadając to pytanie niektórym kolegom, ale wciąż nie mogę znaleźć rozwiązania.Jak utworzyć mozaikę rastrową za pomocą listy rastrów?

Problem polega na tym, że nie mogę utworzyć mozaiki, jeśli moje siatki są wymienione w obiekcie rastrowym. Znalazłem this example, że chociaż mógłbym zastosować, ale nie, dostaję dziwny komunikat o błędzie. Poniższy przykład przedstawia mój problem:

r <- raster() 
r1 <- crop(r, extent(-10, 10, -10, 10)) 
r2 <- crop(r, extent(0, 20, 0, 20)) 
r3 <- crop(r, extent(10, 30, 10, 30)) 

r1[] <- 1:ncell(r1) 
r2[] <- 1:ncell(r2) 
r3[] <- 1:ncell(r3) 
rasters1 <- list(r1, r2, r3) 

mos <- mosaic(rasters1,fun=mean) 

Jest to błąd otrzymuję:

Error in function (classes, fdef, mtable) : 
    unable to find an inherited method for function ‘mosaic’ for signature ‘"list", "missing"’ 

Próbowałem też funkcję sugerowanego w here, ale nie działa.

fmerge <- function(rasters1, fun, ...){ 
    ex <- raster(union(rasters1)) 
    res(ex) <- res(rasters1[[1]]) 
    for(i in 1:length(rasters1)) 
    rasters[[i]] <- merge(rasters1[[i]], ex) 
    rasters <- stack(rasters1) 
    fun(rasters1, ...) 
} 

rfm <- fmerge(rasters1, mean, na.rm=T) 

To jest komunikat o błędzie:

Error in raster(union(rasters1)) : 
    error in evaluating the argument 'x' in selecting a method for function 'raster': Error in as.vector(y) : argument "y" is missing, with no default 

Odpowiedz

12

To wydaje się być regresja w nowszych wersjach rastra. Twój przykładowy kod działa zgodnie z oczekiwaniami w rastrze 1.9-70 (i R 2.13.1), ale daje taki sam błąd, jaki otrzymasz w rastrze 2.0-41 (AD R 2.15.3). Możesz wysłać e-mail do opiekuna, Roberta J. Hijmansa, aby to wskazał.

W międzyczasie problem ten można rozwiązać. Patrząc na różnicę w kodzie między mosaic in raster 1.9-70 i mosaic in raster 2.0-41, widać, że metoda, która przyjęła listę została usunięta. Zamiast tego istnieje teraz tylko metoda akceptująca poszczególne rastry. Więc jeśli masz dużo rastrów, to mają na celu wywołać funkcję tak:

mos1 <- mosaic(r1, r2, r3, fun=mean) 

To nie jest bardzo wygodne, jeśli jednak budują swoją listę rastrów do mozaiki dynamicznie. R ma funkcję pomocnika, która pomoże ci w tej sytuacji, do.call. To, co robi do.call, przyjmuje funkcję i listę, i wywołuje tę funkcję, używając argumentów jako argumentów na liście. Więc można to wykorzystać, tak długo, jak dodać fun=mean do listy argumentów:

rasters1.mosaicargs <- rasters1 
rasters1.mosaicargs$fun <- mean 
mos2 <- do.call(mosaic, rasters1.mosaicargs) 

można dokładnie sprawdzić, że te dwie metody dają takie same wyniki:

stopifnot(identical(mos1, mos2)) 

To może być owinięty w prosta wygodna funkcja, która jest powiązana z odpowiednim podpisem wywołania, dzięki czemu Twój oryginalny kod będzie działać niezmieniony:

setMethod('mosaic', signature(x='list', y='missing'), 
function(x, y, fun, tolerance=0.05, filename=""){ 
    stopifnot(missing(y)) 
    args <- x 
    if (!missing(fun)) args$fun <- fun 
    if (!missing(tolerance)) args$tolerance<- tolerance 
    if (!missing(filename)) args$filename<- filename 
    do.call(mosaic, args) 
}) 
+0

Dzięki! To dobrze działa na przykładzie. I to byłby sposób użycia funkcji z listą mozaiki rastrów <-do.call (mozaika, rastry) – LuluPor

+0

@LuluPor Jeśli najpierw zadzwonisz powyżej 'setMethod (...)', wszystko czego potrzebujesz zrób twoją oryginalną 'mos <- mosaic (rasters1, fun = mean)'. – fmark

+0

Tak, to działa świetnie, dzięki! Mam mozaiki, których potrzebowałem. – LuluPor

Powiązane problemy