2013-03-08 21 views
9

Birkaç raster mozaik oluşturmam gerekiyor. 64bits windows bilgisayarında paket raster sürüm 2.0-31 kullanıyorum. Ev ödevimimin tüm olası blogları kontrol ettiğimi ve bu soruyu bazı meslektaşlarına sorduğuma inanıyorum ama yine de bir çözüm bulamıyorum.Raster mozaik kullanarak raster mozaik nasıl oluşturabilirim?

Sahip olduğum sorun, ızgaralarım raster nesnesinde listeleniyorsa mozaik oluşturamıyorum. Başvurabilmem için this example numaralı telefonu buldum, ancak garip bir hata mesajı alıyorum.

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) 

En fazla bu hatadır: Aşağıdaki örnekte sorunumu temsil

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

Ben de here önerilen işlevi çalıştı, ancak da işe yaramadı.

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 

cevap

12

Bu rasterin yeni sürümlerinde bir gerileme gibi görünüyor:

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) 

Bu

hata mesajıdır. Örnek kodunuz, 1.9-70 (ve R 2.13.1) rasterlerinde beklendiği gibi çalışır, ancak raster 2.0-41'de aldığınızla aynı hatayı verir (ad R 2.15.3). Bunu belirtmek için bakıcı Robert J. Hijmans'a e-posta göndermek isteyebilirsiniz.

Bu arada, bu sorun etrafta uygulanabilir. mosaic in raster 1.9-70 ve mosaic in raster 2.0-41 arasındaki koddaki farka bakıldığında, bir listeyi kabul eden yöntemin kaldırıldığını görebilirsiniz. Bunun yerine, şimdi sadece bireysel rasterleri kabul eden bir yöntem var. Eğer raster çok varsa, böyle işlevini çağırmak içindir Yani: dinamik Mozaiğe raster listenizi inşa ediyoruz eğer

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

Ancak bu, çok uygun değildir. R, bu tür bir durumda size yardımcı olacak yardımcı bir fonksiyona sahiptir, do.call. do.call'un işlevi bir işlev ve bir liste alır ve bu işlevi listedeki öğeleri argümanlar olarak kullanarak çağırır.

stopifnot(identical(mos1, mos2)) 

Bu içine sarılmış edilebilir: Bu iki yöntem aynı sonucu verdiği iki kez kontrol edebilirsiniz

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

: Yani sürece sizin argüman listesine fun=mean eklemek gibi kullanabilir basit uygunluk işlevi ilgili çağrı imzasına bağlı ve böylece orijinal kodunuz değiştirilemeden çalışır:

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

Teşekkürler! Bu örnekle iyi çalışıyor. Ve bu füzyon mozaikler listesi <-do.call (mozaik, raster) – LuluPor

+0

@ LuluPor listesinin kullanılması yolu olacaktır. Eğer yukarıdaki "setMethod (....)" kodunu ilk çağırırsanız, tek yapmanız gereken Yapmak orijinal 'mos <- mozaik (rasters1, eğlenceli = ortalama)' dır. – fmark

+0

Evet, bu harika çalışıyor, teşekkürler! İhtiyacım olan mozaikleri aldım. – LuluPor

İlgili konular