在foreach中导出变量 [英] Export variable in foreach

查看:61
本文介绍了在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屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆