R使用未导出的函数进行并行处理(使用C50示例)

时间:2016-05-29 22:10:44

标签: r foreach machine-learning decision-tree party

我试图在并行处理时从C50模型中提取规则。 This回答帮助我从模型对象中提取规则。但是,由于我需要并行处理模型,我使用的是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)。它抛出错误

  

错误{:任务1失败 - “未找到对象'

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

为什么函数看不到对象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)
  

错误{:任务1失败 - “未找到对象'数据'

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

1 个答案:

答案 0 :(得分:2)

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

尝试从github通过

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

您的示例适用于此版本。