【问题标题】:R: "Object of type 'S4' is not subsettable" when using foreach loopR:使用 foreach 循环时,“'S4' 类型的对象不是子集”
【发布时间】:2016-01-29 17:19:41
【问题描述】:

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

【问题讨论】:

  • “逐行”是什么意思? fishnet 是什么,您是否验证过 fishnet@data 实际上包含一个名称很容易输入错误的列表元素?顺便说一句,您似乎只是在对数据进行直方图;不需要多巴或循环。
  • @CarlWitthoft:“逐行”意味着我只执行属于一起的部分脚本。我为你概括了我的代码。调用中没有错字,因为如果我只执行我的问题中提供的这段代码,它就可以工作。但是,如果我获取脚本,它会抛出上面显示的错误消息。我不做直方图,我只是将一个非常大的 SpPolDaFr 子集十五次。

标签: r foreach


【解决方案1】:

当工作人员没有加载定义其中一个变量的类的包时,通常会出现这种错误。如果 "df" 的类是 "sp" 包定义的 "SpatialPolygonsDataFrame",那么你应该使用 foreach .packages="sp" 选项,以便工作人员能够正确地对 "df" 进行操作。

【讨论】:

  • 抱歉回复晚了,因为我在实践中使用了 lapply 解决方法,所以不得不恢复我的旧脚本。但是,在 foreach 选项中加载包 是解决方案!之后我的脚本运行没有错误,我什至可以获取它。谢谢!我将更新问题标题以更好地解决这里的问题。
  • @pat-s 不确定是否有效), relevant discussion.
【解决方案2】:

我想建议在注册多线程时使用不同的集群类型。与默认类型不同,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)

【讨论】:

    猜你喜欢
    • 2022-09-28
    • 2018-11-01
    • 2014-02-23
    • 1970-01-01
    • 2022-01-25
    • 1970-01-01
    • 2023-03-28
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多