在 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)
我想在 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)