【发布时间】:2017-03-08 17:11:32
【问题描述】:
我正在尝试使用 foreach 循环来玩多个 glms。我遇到的问题是,当我尝试指定权重时,它表示找不到对象。下面是重现我遇到的问题的代码。
library(foreach)
library(doParallel)
registerDoParallel(cores=4)
getDoParWorkers()
train_samples<-vector(mode="list", length=4)
for(i in 1:4){
train_samples[[i]]<-sample(nrow(mtcars),nrow(mtcars)*.8,replace=FALSE)
}
train_samples
d_data<-mtcars
#Add a weights column to illustrate the issue. The actual weights would vary.
d_data$weights = 1
#This results in an error: object 'd_data' not found
foreach(k=1:4) %dopar%{
model.fit<-glm(formula='hp~cyl+disp+mpg',
family=poisson,
data=d_data[train_samples[[k]],],
weights=d_data[train_samples[[k]],12])
}
#Removing the weights condition makes it run fine.
foreach(k=1:4) %dopar%{
model.fit<-glm(formula='hp~cyl+disp+mpg',
family=poisson,
data=d_data[train_samples[[k]],])
}
我已经在网上寻找解决方案,但找不到任何东西。我想知道为什么这是一个问题以及如何解决它。提前致谢!
编辑 1:我在下面添加了一个附加示例。
w1<-numeric(25)+1
#This has the same problem with object w1 not being found.
#Setting .export="w1" doesn't help either
foreach(k=1:4, .export="w1") %dopar%{
model.fit<-glm(formula='hp~cyl+disp+mpg',
family=poisson,
data=d_data[train_samples[[k]],],
weights=w1)
}
#However, manually defining a numeric vector for weights works
foreach(k=1:4) %dopar%{
model.fit<-glm(formula='hp~cyl+disp+mpg',
family=poisson,
data=d_data[train_samples[[k]],],
weights=numeric(25)+1)
}
编辑 2:版本信息。
Windows 10
RStudio 版本:1.0.136
R 版本:3.3.1
foreach 版本:1.4.3
doParallel 版本:1.0.10
【问题讨论】:
-
您可能需要将权重/数据传递给处理它的核心。 gforge.se/2015/02/how-to-go-parallel-in-r-basics-tips你试过.export吗?
-
我无法复制您的错误。我得到一个不同的错误,“任务 1 失败 - “找不到对象 'k'”。
-
@MJH,我尝试过使用 .export="d_data" 并得到相同的错误,警告 d_data 已经被导出。我在下面添加了一个附加示例。
-
@msubbaiah,我不确定您为什么会收到该错误。如果错误是由“权重”参数引起的,我添加了一个额外的示例,它可能对您有用。
-
@Kyle 感谢您的编辑。导出功能应该可以工作。我仍然无法复制您的错误。两个 foreach 循环都为我运行。