使用 doParallel 时的范围问题
Posted
技术标签:
【中文标题】使用 doParallel 时的范围问题【英文标题】:Scoping issue when using doParallel 【发布时间】:2018-12-01 18:14:11 【问题描述】:我正在尝试使用 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
就是找不到上面两行代码中使用的数据。
数据会自动导出到节点,因此在foreach
中使用.export
是多余的。
对如何使这项工作有任何建议?
【问题讨论】:
【参考方案1】: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())
构造。
【讨论】:
非常感谢。这确实解决了我的问题。eval(bquote())
构造到底是什么意思?
感谢您的澄清! :)
还有一个问题:现在npsigtest
找到了数据。但是当有包含NA
的行被npregbw
过滤掉时,npsigtest
不知道哪些行被忽略了。通常它确实知道这一点。
在npestimate
内或之前(但在foreach
内)这样做也不起作用。以上是关于使用 doParallel 时的范围问题的主要内容,如果未能解决你的问题,请参考以下文章
在 R 中将 fread 与 foreach 和 doParallel 一起使用