在foreach中导出变量 [英] Export variable in foreach
问题描述
我在将数据帧导出到foreach包中的%dopar%
时遇到问题.如果我将%do%
与 registerDoSEQ()
一起使用,它会起作用,但是与 registerDoParallel()
一起使用,我总会得到:
{中的错误:任务1失败-未找到对象'驼背'"
以下是可重复使用的示例,该示例使用了来自 rpart
包中的 kyphosis
数据.我正在尝试逐步逐步回归:
库(doParallel)库(foreach)库(rpart)invars<-c('Age','Number','Start')n_vars<-2vars <-length(invars)iter<-trunc(vars/n_vars)线程<-4如果(vars %% n_vars == 0)iter<-iter-1iter<-0:itercl<-makeCluster(线程)registerDoParallel(cl)#registerDoSEQ()条款<-''min_formula<-paste0('Kyphosis〜1',项)适合<-glm(公式= as.formula(min_formula),数据=驼背,家族='二项式')out<-foreach(x = iter,.export ='驼背')%dopar%{nv<-invars [(x * n_vars +1):( min(x * n_vars + n_vars,vars))]sfit<-step(object = fit,trace = FALSE,scope = list(较低= min_formula,upper = as.formula(paste(min_formula,'+',paste0(nv,塌陷='+'))))),步骤= 1,方向=前进")aic<-sfit $ aic名称(aic)<-if(nrow(sfit $ anova)== 2)sfit $ anova $ Step [2]集成电路}出去stopCluster(cl)
在调用 step
函数之前,将其添加到 foreach
主体中:
.GlobalEnv $后凸<-后凸
我不确定为什么会发生这种情况,但是我的直觉是 step
使用存储在 fit $ call
中的信息在自身内部调用 glm
,这是
glm(公式= as.formula(min_formula),家族=二项式",数据=后凸畸变)
使用新的更新公式,但部分 data =驼背
保持不变.因此, glm
会尝试在全局环境中寻找 kyphosis
.
I am having trouble exporting a data frame to %dopar%
in foreach package. It works if I use %do%
together with registerDoSEQ()
, but with registerDoParallel()
I always get:
Error in { : task 1 failed - "object 'kyphosis' not found"
Here is a reproducible example using kyphosis
data from rpart
package. I am trying to parallelize stepwise regression a little:
library(doParallel)
library(foreach)
library(rpart)
invars <- c('Age', 'Number', 'Start')
n_vars <- 2
vars <- length(invars)
iter <- trunc(vars/n_vars)
threads <- 4
if (vars%%n_vars == 0) iter <- iter - 1
iter <- 0:iter
cl <- makeCluster(threads)
registerDoParallel(cl)
#registerDoSEQ()
terms <- ''
min_formula <- paste0('Kyphosis~ 1', terms)
fit <- glm(formula = as.formula(min_formula), data = kyphosis, family = 'binomial')
out <- foreach(x = iter, .export = 'kyphosis') %dopar% {
nv <- invars[(x * n_vars + 1):(min(x * n_vars + n_vars, vars))]
sfit <- step(object = fit, trace =FALSE, scope = list(
lower = min_formula,
upper = as.formula(paste(min_formula, '+', paste0(nv, collapse = '+')))),
steps = 1, direction = 'forward')
aic <- sfit$aic
names(aic) <- if(nrow(sfit$anova) == 2) sfit$anova$Step[2]
aic
}
out
stopCluster(cl)
Add this in the body of foreach
before calling step
function:
.GlobalEnv$kyphosis <- kyphosis
I'm not sure why this happens, but my intuion is that step
calls glm
inside itself using information stored in fit$call
, which is
glm(formula = as.formula(min_formula), family = "binomial", data = kyphosis)
with new updated formula, but the part data = kyphosis
remains the same. So glm
tries to look for kyphosis
in the global environment.
这篇关于在foreach中导出变量的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!