7

土壌図の枠内で、未定の数のラスターを合計する必要があります。'raster'パッケージと'do.call'関数を使用してそれを実行しようとしています。ただし、「sum」関数が合計して多数のラスターになる可能性がある場合、do.callを使用して同じ操作を実行すると、エラーが発生します。私は何を間違っているのですか?

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'

助けてくれてありがとう、

フランソワ

4

2 に答える 2

8

Reduceとを使用し+て、リストから合計を計算できます。

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)

元のコマンドが機能しない理由については、それはやや当惑しています。関数名を文字として指定すると機能するようです。

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)

ただし、これは他のコンテキストでは必要ありません。

do.call(sum,list(1,2,3))
[1] 6
于 2013-01-10T15:25:41.027 に答える
3

なぜこれが機能しないのか(Jamesが指摘するようにsumの周りに引用符がない場合)、おそらくこれはS4 Summaryグループジェネリックのメンバーである「sum」に関連するバグ(または機能)です。「max」や「prod」などの他のメンバーも同じ動作をします。

いずれにせよ、しかし代わりに

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

あなたもすることができます

 sum(stack(r1,r2,r3))

または、すでにリストがある場合

 sum(stack(list(r1,r2,r3)))
于 2013-01-15T05:52:59.927 に答える