首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用doParallel时的作用域问题

使用doParallel时的作用域问题
EN

Stack Overflow用户
提问于 2018-06-22 09:36:20
回答 1查看 43关注 0票数 3

我试图使用doParallel包来估计多个非参数模型。不过,我的问题似乎与np包有关。看看这个可复制的例子:

代码语言:javascript
复制
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是多余的。

有什么建议可以让这件事成功吗?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-06-22 10:49:27

npsigtest很大程度上复制了lmlm对象函数中使用的方法。因此,它有着同样的潜在范围陷阱。问题是与公式有关的环境:

代码语言:javascript
复制
environment(models[[1]])
#<environment: R_GlobalEnv>

很容易修复:

代码语言:javascript
复制
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())结构。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/50985028

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档