R嵌套的foreach%dopar%-内循环问题

时间:2020-01-09 13:31:44

标签: r foreach

我有几个空间实体,我希望从中提取几年的每日气候数据时间序列。为此,我定义了一个函数,该函数允许为一个实体提取一年的对应时间序列(= 365个数据的向量)。然后,我在foreach包的嵌套循环%:%中使用了此函数,其中outter循环用于循环我的每个空间实体,inner循环用于循环时间系列。作为输出,我希望有一个数据框,其列中有我的空间实体,行中有气候数据时间序列。例如,对于10个实体和10年的数据,我的数据框的尺寸将为10列和10 * 365 = 3650行。下面的代码部分起作用,因为内部循环(按年份)仅对year参数的前两个元素起作用。就像j = 1:2。其他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)

0 个答案:

没有答案
相关问题