我处理一些shapefile和栅格。
当我逐行(或逐个部分)执行我的脚本时,一切都按预期运行。但是,如果我作为一个整体执行它(源它或STRG + A然后STRG + ENTER),它会在以下部分中引发错误:
# ... some code
list = list()
list = foreach(i = seq(from = 9, to = 80, by = 5)) %dopar% {
df[which(df@data$column.name > i), ]
}
# ... some code
错误讯息:Error in { : task 2 failed - "Object of type 'S4' is not subsettable"
其中fishnet
是SpatialPolygonsDataFrame。代码子集我的SpPolDaFr所以我在列表中写了15个子集化的SpPolDaFr。
我想的可能是foreach
原因。但是,我有其他foreach
调用先验,运行正常。我执行doParallel
循环,因为我的SpPolDaFr大小为11 GB,以加快速度。
答案 0 :(得分:4)
当工作者没有加载定义其中一个变量类的包时,通常会出现这种错误。如果“df”类是由“sp”包定义的“SpatialPolygonsDataFrame”,则应使用foreach .packages="sp"
选项,以便工作人员能够正确操作“df”。
答案 1 :(得分:0)
我建议在注册多线程时使用不同的集群类型。与默认类型不同,FORK
创建进程的副本。无需指定包,但 FORK
仅在 Unix 上可用。代码应如下所示:
cl <- makeCluster(N_CORES, type = "FORK")
registerDoParallel(cl)
list = foreach(i = seq(from = 9, to = 80, by = 5)) %dopar% {
df[which(df@data$column.name > i), ]
}
stopCluster(cl)