2013-03-08 6 views
9

いくつかのラスタモザイクを作成する必要があります。私は64ビットWindowsコンピュータ上でパッケージラスタバージョン2.0-31を使用しています。私は可能性のあるすべてのブログを通して宿題をチェックし、この質問を一部の同僚に依頼したが、解決策を見つけることはできないと思う。ラスタのリストを使用して、ラスタモザイクを作成するにはどうすればよいですか?

問題は、グリッドがラスタオブジェクトにリストされている場合にモザイクを作成できないことです。私はthis exampleを見つけましたが、適用することはできますが、私は奇妙なエラーメッセージが表示されます。以下の例では、私の問題を表しています。

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) 

これは私が取得エラーです:

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

私もhereで示唆された機能を試してみましたが、どちらか動作しませんでした。

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) 

これはエラーメッセージです:

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 

答えて

12

これは、ラスタの新しいバージョンでの回帰のようです。サンプルコードは、ラスタ1.9-70(およびR 2.13.1)では期待どおりに実行されますが、ラスタ2.0-41(広告R 2.15.3)で受け取ったのと同じエラーが表示されます。このことを指摘するために、メンテナーRobert J. Hijmansに電子メールで連絡してください。

この間、この問題は回避できます。 mosaic in raster 1.9-70mosaic in raster 2.0-41のコードの違いを見ると、リストを受け入れたメソッドが削除されていることがわかります。代わりに、個々のラスタを受け入れるメソッドしかありません。ですから、ラスタの多くを持っている場合、あなたはこのように関数を呼び出すことを意味している:あなたが動的にモザイクするラスタのあなたのリストを構築している場合

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

これは、しかし、非常に便利ではありません。 Rにはこのような状況であなたを助けるヘルパー機能があります。do.calldo.callは、関数とリストをとり、リスト内の項目を引数として使用してその関数を呼び出します。

stopifnot(identical(mos1, mos2)) 

これはにラップすることができます:あなたはこれらの2つの方法が同じ結果を与えることをダブルチェックすることができます

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

:だから、限り、あなたはあなたの引数リストにfun=meanを追加すると、これを使用することができますシンプルな便利機能と関連するコールシグネチャにバインドされているので、元のコードは変更されずに機能します。

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

ありがとう!この例でうまくいく。これは、ラスタモザイクのリストを使ってfuctionを使う方法です。<-do.call(mosaic、rasters) – LuluPor

+0

@LuluPor上記の 'setMethod(....)'コードを最初に呼び出すと、 doは元の 'mos < - モザイク(rasters1、fun = mean)'を呼び出します。 – fmark

+0

はい、すごくうれしくありがとう!私は必要なモザイクを持っています。 – LuluPor

関連する問題