Экспортировать переменную в foreach

У меня проблемы с экспортом фрейма данных в %dopar% в пакете foreach. Это работает, если я использую %do% вместе с registerDoSEQ(), но с registerDoParallel() Я всегда получаю:

Error in { : task 1 failed - "object 'kyphosis' not found"

Вот воспроизводимый пример использования kyphosis данные из rpart пакет. Я пытаюсь распараллелить ступенчатую регрессию немного:

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)

1 ответ

Добавьте это в теле foreach перед звонком step функция:

.GlobalEnv$kyphosis <- kyphosis

Я не уверен, почему это происходит, но моя интуиция заключается в том, что step звонки glm внутри себя, используя информацию, хранящуюся в fit$call, который

glm(formula = as.formula(min_formula), family = "binomial", data = kyphosis)

с новой обновленной формулой, но часть data = kyphosis остается такой же. Так glm пытается искать kyphosis в глобальной среде.

Другие вопросы по тегам