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")
您的示例适用于此版本。
我正在尝试在并行处理时从 C50 模型中提取规则。
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")
您的示例适用于此版本。