R foreach 具有未导出函数的并行处理(以 C50 为例)

R foreach parallel processing with unexported functions (with C50 example)

我正在尝试在并行处理时从 C50 模型中提取规则。 回答帮助我从模型对象中提取规则。但是,由于我需要并行处理模型,因此我使用的是 foreach。这似乎与未导出函数有问题,因为它看不到数据对象。这是一些可重现的代码:

library(foreach)
library(doMC)
registerDoMC(2)

j = c(1,2)
result = foreach(i = j) %dopar% {
  library(C50)
  d = iris
  model <- C5.0(Species ~ ., data = d)
  modParty <- C50:::as.party.C5.0(model)
  return(modParty)
}

在这种情况下,它只计算模型两次。在我的真实代码中,d 是一个不断变化的样本,它也在 foreach 函数中生成。

我的调试显示杂项线是modParty <- C50:::as.party.C5.0(model)。它抛出错误

Error in { : task 1 failed - "Object 'd' not found"

即使 d 确实可供集群中的每个工作人员使用。我通过 logging 包的 loginfo(ls()) 登录文件进行了检查。

为什么函数看不到对象d?非常感谢任何帮助。

此处的附加信息是 traceback()

> traceback()
3: stop(simpleError(msg, call = expr))
2: e$fun(obj, substitute(ex), parent.frame(), e$data)
1: foreach(i = j) %dopar% {
       library(C50)
       d = iris
       model <- C5.0(Species ~ ., data = d)
       modParty <- C50:::as.party.C5.0(model)
       return(modParty)
   }

编辑

澄清一下:它与 foreach 没有任何关系。这是与正常功能相同的错误:

library(C50)

d = iris

getC50Party = function(dat){
  model <- C5.0(Species ~ ., data = dat)
  modParty <- C50:::as.party.C5.0(model)
  return(modParty)
}

c50Party = getC50Party(d)

Error in { : task 1 failed - "Object 'dat' not found"

问题是 as.party.C5.0 试图从整个工作区访问数据对象。

这是一个错误。我们遵循 Achim 的建议并使用 terms 对象,除非我们 get the case wrong

尝试通过

从 github 安装
devtools::install_github("topepo/C5.0/pkg/C50")

您的示例适用于此版本。