10

いくつかのラスター モザイクを作成する必要があります。64 ビット Windows コンピューターでパッケージ ラスター バージョン 2.0-31 を使用しています。可能性のあるすべてのブログをチェックし、何人かの同僚にこの質問をする宿題をしたと思いますが、まだ解決策を見つけることができません.

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

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)

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

関数 (classes、fdef、mtable) のエラー: シグネチャ '"list"、"missing"' の関数 'mosaic' の継承されたメソッドが見つかりません</p>

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)

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

raster(union(raster1)) のエラー: 関数 'raster' のメソッドを選択する際に引数 'x' を評価する際のエラー: as.vector(y) のエラー: 引数 "y" が欠落しており、デフォルトはありません

4

1 に答える 1

16

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

当面の間、この問題は回避できます。ラスター 1.9-70のモザイクとラスター 2.0-41 のモザイクのコードの違いを見ると、リストを受け入れるメソッドが削除されていることがわかります。代わりに、個々のラスターを受け入れるメソッドのみが存在するようになりました。したがって、多数のラスターがある場合は、次のように関数を呼び出す必要があります。

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

ただし、動的にモザイク化するラスターのリストを構築している場合、これはあまり便利ではありません。R には、この種の状況で役立つヘルパー関数がありますdo.call。関数とdo.callリストを取り、リスト内の項目を引数として使用してその関数を呼び出します。fun=meanしたがって、引数リストに追加する限り、これを使用できます。

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

これら 2 つの方法で同じ結果が得られることを再確認できます。

stopifnot(identical(mos1, mos2))

これは、関連する呼び出しシグネチャにバインドされた単純な便利な関数にラップできるため、元のコードは変更されずに機能します。

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)
})
于 2013-03-09T03:26:27.857 に答える