使用doParallel时的作用域问题

时间:2018-06-22 09:36:20

标签: r doparallel

我正在尝试使用doParallel包来估计多个非参数模型。我的问题似乎与np包有关。 看一下这个可重现的示例:

library(np)
library(doParallel)

df     <- data.frame(Y = runif(100, 0, 10), X = rnorm(100))
models <- list(as.formula(Y ~ X))

npestimate <- function(m, data) {
  LCLS <- npregbw(m, data = data, regtype = "lc", bwmethod = "cv.ls")
  LLLS <- npregbw(m, data = data, regtype = "ll", bwmethod = "cv.ls")
  # sigt <- npsigtest(LCLS, boot.method = "wild", boot.type = "I")
  return(list(LCLS = LCLS, LLLS = LLLS))
}

cl <- makeCluster(length(models))
registerDoParallel(cl)

results <- foreach(m = models, .packages = "np", .verbose = T) %dopar% 
  npestimate(m, data = df)

stopCluster(cl)

如您所见,我创建了一个名为npestimate()的函数,以便为每个模型计算不同的内容。我注释了一行要使用npsigtest进行重要性测试的地方。通常,npsigtest通过在调用npregbw的环境中查找来获取使用的数据。

但这在这里不起作用。我不知道为什么,但是npsigtest只是找不到上面两行代码中使用的数据。 数据会自动导出到节点,因此在.export中使用foreach是多余的。

有什么建议可以做到这一点吗?

1 个答案:

答案 0 :(得分:3)

npsigtest几乎复制了lm对象和lm对象使用的方法。因此,它具有相同的潜在范围陷阱。问题是与公式关联的环境:

environment(models[[1]])
#<environment: R_GlobalEnv>

易于修复:

npestimate <- function(m, data) {
  environment(m) <- environment()
  LCLS <- npregbw(m, data = data, regtype = "lc", bwmethod = "cv.ls")
  LLLS <- npregbw(m, data = data, regtype = "ll", bwmethod = "cv.ls")
  sigt <- npsigtest(LCLS, boot.method = "wild", boot.type = "I")
  return(list(LCLS = LCLS, LLLS = LLLS))
}

由于这些问题,我实际上通常更喜欢eval(bquote())构造。