私ができる限り試してみてください、plyrを機能させる方法がよくわかりません。この特定の例の助けと、例が機能する理由の説明に対するボーナスポイントをいただければ幸いです。
誰かがこの例を「実行可能」にしたい場合に備えて、データはここにあります
設定:
library(ncdf)
library(plyr)
longs = seq.int(from=1,to=4320,by=6)
lats = seq.int(from=1,to=2160,by=6)
blocksize = 6
maize.nc = open.ncdf('maize_5min.nc')
この for ループは機能しますが、遅く、並列ではありません。
latlongcoords = NULL
for (x in 1:length(longs)) {
for (y in 1:length(lats)) {
lat = mean(get.var.ncdf(maize.nc,varid="latitude",start = lats[x],count = blocksize))
lon = mean(get.var.ncdf(maize.nc,varid="longitude",start = longs[y],count = blocksize))
rw = c(lat,lon)
latlongcoords = rbind(latlongcoords,rw)
}
#print(x)
}
save(latlongcoords,file="latlongcoords")
私はこのようなことをしたい:
require(doMC)
registerDoMC(32)
x = seq(1:10) #shorten it for testing purposes
y = seq(1:10) #shorten it for testing purposes
makecoords = function(x,y){
lat = mean(get.var.ncdf(maize.nc,varid="latitude",start = lats[x],count = blocksize))
lon = mean(get.var.ncdf(maize.nc,varid="longitude",start = longs[y],count = blocksize))
c(lat,lon)
}
latlongcoords = NULL
latlongcoords = aaply(.data = cbind(x,y), .margins=2, .fun=makecoords(x,y),.parallel=TRUE)
実行すると、次のエラー メッセージが表示されます。
Error in get.var.ncdf(maize.nc, varid = "latitude", start = lats[x], count = blocksize) :
Error: variable has 1 dims, but start has 10 entries. They must match!
plyr は、個々の値ではなく、ベクトル全体を関数に渡しているようです! これを機能させる方法についてのアドバイスと、修正が機能する理由の説明をいただければ幸いです。
前もって感謝します!