在 R 中使用 doParallel 在 foreach 循环中使用栅格堆栈

Use a raster Stack in foreach loop with doParallel in R

我想在 R 中对大型栅格堆栈中的每一层执行一系列计算,并将每一层的结果保存为单独的栅格供以后使用。我正在尝试使用 foreach 和 doParallel 加快进程。这是基本代码,对堆栈中的每一层进行了简单的计算 (*3):

library(raster)
library(doParallel)

RasterStack<- stack(system.file("external/rlogo.grd", package="raster")) 
RasterStack<-addLayer(RasterStack,RasterStack)

cl <- makeCluster(2)
registerDoParallel(cl)

RasterStack<- stack(system.file("external/rlogo.grd", package="raster")) 
RasterStack<-addLayer(RasterStack,RasterStack)

foreach(rasname=iter(names(RasterStack)),packages="raster") %dopar%{
  ras<-RasterStack[[rasname]]*3
  save(ras,file=paste0(rasname,"_new.Rras"))
}

大部分都有效,但前 N 层未处理,其中 N 是节点数(例如上面的 2)。我收到以下错误:{ 错误:任务 1 失败 - "this S4 class is not subsettable"。该错误主要仅在所有其他层都已正确处理后发生(即只有前 N 层不起作用,并且这通常不会阻止其他层的处理——尽管偶尔会发生)。如果 运行 按顺序使用 %do%.

,则所有层都得到正确处理 任何人都可以解释这种行为或提供解决方案吗?
谢谢

好像只缺了packages前面的.。这对我有用:

foreach(rasname = iter(names(RasterStack)), .packages = "raster") %dopar% {
  ras <- RasterStack[[rasname]] * 3
  save(ras, file = paste0(rasname, "_new.Rras"))
}

如果您希望将结果放入新的堆栈而不是单独的文件中:

# libraries
library(raster)
library(doParallel)

# fake data
RasterStack1 <- stack(system.file("external/rlogo.grd", package="raster")) 
RasterStack1 <- addLayer(RasterStack1, RasterStack1)
plot(RasterStack1)

# make cluster
cl <- makeCluster(2)
registerDoParallel(cl)

# parallel loop
RasterStack2 <- foreach(rasname=iter(names(RasterStack1)), 
                    .packages="raster") %dopar% {
RasterStack1[[rasname]]*3
}

# make result a stack
RasterStack2 <- stack(RasterStack2)
plot(RasterStack2)

# stop cluster
stopCluster(cl)