R:"类型对象' S4'不是子集表格"当使用foreach循环时

时间:2016-01-29 17:19:42

标签: r foreach

我处理一些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,以加快速度。

2 个答案:

答案 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)