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

具有未报告函数的R foreach并行处理(以C50为例),r,foreach,machine-learning,decision-tree,party,R,Foreach,Machine Learning,Decision Tree,Party,我试图在并行处理时从C50模型中提取规则。答案帮助我从模型对象中提取规则。然而,由于我需要并行处理模型,所以我使用foreach。这似乎与notexported函数有关,因为它看不到数据对象。以下是一些可复制的代码: library(foreach) library(doMC) registerDoMC(2) j = c(1,2) result = foreach(i = j) %dopar% { library(C50) d = iris model <- C5.0(Spe

我试图在并行处理时从C50模型中提取规则。答案帮助我从模型对象中提取规则。然而,由于我需要并行处理模型,所以我使用foreach。这似乎与notexported函数有关,因为它看不到数据对象。以下是一些可复制的代码:

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)
}
编辑

只是澄清一下:它不必与
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)
库(C50)
d=虹膜
getC50Party=函数(dat){

model这是一个bug。我们确实按照Achim的建议使用
术语
对象,除非我们

尝试通过从github安装

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

您的示例适用于此版本。

这是一个bug。我们确实按照Achim的建议使用了
术语
对象,除非我们需要

尝试通过从github安装

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

您的示例适用于此版本。

我不确定这里到底发生了什么,因为
partykit
(我与他人合著)根本不涉及。这一切都归结于
C50
包对其模型的作用。我的初步评估是
C5.0
对象应该更好地保留它们的
术语,而不是在
as.party
方法中重新构建它们。但我真的没有深入探讨这一点。作为
C50
maintainer目前似乎没有这样做,我建议直接联系他。但可能是因为某种原因,
as.party
方法没有导出……是的,它是这样的。因为
as.party.C5.0
方法试图从通用worksp访问
d
而不是从
model
对象访问ace(即使不是来自工人的工作区)。我已经给Max发了电子邮件,并向他发送了指向SO问题的链接。不幸的是,我没有得到回复…我认为目前我无法使用此软件包并行运行。我甚至查看了函数的源代码,但为此,我想我太新手了:/@AchimZeileis我想我现在找到了错误。函数
as.party.C5.0
调用另一个er未报告的函数
model.frame.C5.0
。在此方法中,调用使用错误环境的基函数
eval()
(在这种情况下,
d
对象不再存在)。解决方法是插入
env=parent.frame(2)
因为环境需要是第二个父框架。我是否有可能编辑源代码,以便在维护人员看不到的情况下使用错误修复?我已经尝试过了是这是“明显”的问题(如果您以前使用过公式/术语/模型框架),但是
父框架(2)
解决方案可能不是最好或最可靠的解决方案。我认为最好保留
术语(如我上面所述)这样做可以保存环境信息。如果我是维护者,至少我会尝试实现这一点。如果Max不响应您的查询,最简单的解决方案是从CRAN下载包的.tar.gz,修改源代码,然后在您的机器上重新构建和安装包。哦,我明白了,现在您的第一条评论也是kes对我来说更有意义;-)抱歉,这是我第一次深入研究一个包。现在我已经按照你的建议做了。我下载了源代码并对其进行了更改(但仅限于
parent.frame(2)
解决方案),然后再次安装了更改后的包。它似乎可以与
as.party()一起工作
功能和
安装的功能。但是由维护人员修复bug还是很好的!我不确定这里到底发生了什么,因为
partykit
(这是我合著的)根本不涉及。这一切都归结于
C50
包对其模型的作用。我的初步评估是
C5.0
对象应该更好地保留它们的
术语,而不是在
as.party
方法中重新构建它们。但我真的没有深入探讨这一点。作为
C50
maintainer目前似乎没有这样做,我建议直接联系他。但可能是因为某种原因,
as.party
方法没有导出……是的,它是这样的。因为
as.party.C5.0
方法试图从通用worksp访问
d
而不是从
model
对象访问ace(即使不是来自工人的工作区)。我已经给Max发了电子邮件,并向他发送了指向SO问题的链接。不幸的是,我没有得到回复…我认为目前我无法使用此软件包并行运行。我甚至查看了函数的源代码,但为此,我想我太新手了:/@AchimZeileis我想我现在找到了错误。函数
as.party.C5.0
调用另一个er未报告的函数
model.frame.C5.0
。在此方法中,调用使用错误环境的基函数
eval()
(在这种情况下,
d
对象不再存在)。解决方法是插入
env=parent.frame(2)
因为环境需要是第二个父框架。我是否有可能编辑源代码,以便在维护人员看不到的情况下使用错误修复?我已经尝试过了是这是“明显”的问题(如果您以前使用过公式/术语/模型框架),但是
父框架(2)
解决方案可能不是最好或最可靠的解决方案。我认为最好保留
术语(如我上面所述)这样做可以保存环境信息。如果我是维护者,至少我会尝试实现这一点。如果Max不响应您的查询,最简单的解决方案是从CRAN下载包的.tar.gz,修改源代码,然后在您的机器上重新构建和安装包。哦,我明白了,现在您的第一条评论也是夏娃