R Nested foreach% dopar% - проблема с внутренним циклом - PullRequest
0 голосов
/ 09 января 2020

У меня есть несколько пространственных объектов, для которых я хотел бы извлечь дневные временные ряды климатических данных за несколько лет. Для этого я определил функцию, которая позволяет извлекать для одной сущности соответствующее время ser ie для одного года (= вектор из 365 данных). Затем я использовал эту функцию во вложенном l oop%:% с пакетом foreach с выходным значением l oop для циклических циклов на каждой из моих пространственных сущностей и внутренним l oop для циклических циклов в каждый год времени ser ie. В качестве вывода я хотел бы иметь фрейм данных со столбцами моих пространственных объектов и в строке время климатических данных ser ie. Например, для данных 10 сущностей и 10 лет размерность моего кадра данных будет 10 столбцов и 10 * 365 = 3650 строк. Приведенный ниже код работает частично, поскольку внутренний l oop (on year) работает только для двух первых элементов моего аргумента year. Это как j = 1: 2. Внутренний l oop не работает для других значений j.

Может ли кто-нибудь мне помочь? Большое спасибо!

library(foreach) ; library(doParallel)
library(stringr)
library(raster)

ExtractFromGrid<-function(year=year, grid=grid, liste=liste, fun=fun){
# Mandatory : Shapefile with a colomn "ID_1"
# Targeted year
yeari<-year
# Targeted element in the grid file
gridi<-grid
grid.name<-gridi@data$ID_1
gridi.ext<-extent(gridi)
# Input raster for year j
list.ini<-str_subset(liste, as.character(yeari))
rain<-stack(list.ini)
# Extract value for grid i
gridi.crop<-extract(rain, gridi.ext, fun=fun, layer=1, nl=nlayers(rain))
gridi.v<-as.vector(gridi.crop)
# Format output
output<-data.frame(gridi.v)
colnames(output)<-grid.name
return(output)
}

setwd("myPath")
# Grid to extract
grid.oug<-shapefile("myPath\\BASED_GRID_OUGANDA")

# Rainfall CHRIPS raster
liste.rainfall<-list.files(path=".", pattern="OUG",full.names = TRUE)

year<-seq(1989,2016)

no_cores <- detectCores() - 2
cl <- makeCluster(no_cores)
registerDoParallel(cl)

#start time
strt<-Sys.time()

outtotal<- foreach(i= 1:length(grid.oug), .packages=c("raster", "stringr"), .combine='cbind') %:%
foreach(j=1:length(year), packages=c("raster", "stringr"), .combine='rbind') %dopar% {
ExtractFromGrid(year=year[j], grid=grid.oug[i,], liste=liste.rainfall, fun='mean')
}

print(Sys.time()-strt)
stopCluster(cl)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...