Я хочу сделать это:

for(i in 1:length(dlist)){
  rlist[[i]] <- rasterize(u[,c("Lon","Lat")], r, dlist[[i]], fun=mean)
}

Поскольку мне придется делать это для нескольких файлов (длина списка составляет около 300), я хочу обрабатывать каждые 4 файла параллельно, поэтому я попробовал это (только чтобы получить первые четыре).

cl=makeCluster(detectCores() - 2)
registerDoParallel(cl)
rlist = list()
foreach(i= 1:1, .packages="raster",.export=('rlist'),.combine= 'c') %dopar% {

 rlist[[i]] <- rasterize(u[,c("Lon","Lat")], r, dlist[[i]], fun=mean)
}

Однако это печатает список в консоли и не назначает каждую растеризацию i-му элементу списка, какие-нибудь идеи, почему? Спасибо!

0
Ricardo Alonso Esparza Gamez 9 Ноя 2018 в 01:35

1 ответ

Лучший ответ

Я думаю ты хочешь

x <- foreach(i= 1:4, .packages="raster", .combine=stack) %dopar% {
    rasterize(u[,c("Lon","Lat")], r, dlist[[i]], fun=mean)
}

Простой пример

library(raster)
library(foreach)
r <- raster(nrow=10, ncol=10, vals=1)
x <- foreach(i= 1:4, .packages="raster", .combine=stack) %do% { r + i }

s <- stack(x)
s 
#class       : RasterStack 
#dimensions  : 10, 10, 100, 4  (nrow, ncol, ncell, nlayers)
#resolution  : 36, 18  (x, y)
#extent      : -180, 180, -90, 90  (xmin, xmax, ymin, ymax)
#coord. ref. : +proj=longlat +datum=WGS84 +ellps=WGS84 +towgs84=0,0,0 
#names       : layer.1, layer.2, layer.3, layer.4 
#min values  :       2,       3,       4,       5 
#max values  :       2,       3,       4,       5 

Или за один шаг

x <- foreach(i= 1:4, .packages="raster", .combine=stack) %do% { r + i }

Но я думаю, что самым простым и эффективным подходом может быть растеризация всех переменных за один шаг.

 d <- as.matrix(as.data.frame(dlist)) 
 s <- rasterize(u[,c("Lon","Lat")], r, d, fun=mean)
1
Robert Hijmans 9 Ноя 2018 в 00:19