在Windows 10的RStudio中,我编写了一个并行执行计算的函数,如下所示:
doSomething = function(a, b, c) {
# Inner function that does the actual work when parallelised
work = function (a, b, c) {
# Do something
e = func1(a, b)
f = func2(c)
result = e + f
return(result)
}
# Carry out work in parallel
cl = makeCluster(6)
registerDoParallel(cl)
output = foreach(i = 1:10, .packages=c("foo", "bar")) %dopar%
work(a, b, c)
stopCluster(cl)
return(output)
}
如果我将函数从R脚本加载到内存中,这样可以正常工作;但是,我想将它包含在我正在编写的包中。因此,在包文件中,我小心识别外部函数的命名空间,并在DESCRIPTION
文件中引用它们的包。例如:
doSomething = function(a, b, c) {
# Inner function that does the actual work when parallelised
work = function (a, b, c) {
# Do something
e = foo::func1(a, b)
f = bar::func2(c)
result = e + f
return(result)
}
# Carry out work in parallel
cl = parallel::makeCluster(6)
doParallel::registerDoParallel(cl)
output = foreach::foreach(i = 1:10, .packages=c("foo", "bar")) %dopar%
work(a, b, c)
parallel::stopCluster(cl)
return(output)
}
并在DESCRIPTION
文件中:
...
Imports:
foo,
bar,
doParallel,
foreach,
parallel
(编辑)NAMESPACE
文件包含以下内容:
# Generated by roxygen2 (4.1.1): do not edit by hand
export(doSomething)
问题是,当我构建我的包并从包中运行该函数时,我收到以下错误并执行停止:
Error in doSomething(a, b, c):
could not find function "%dopar%"
由于%dopar%
是一个操作符,而不是一个函数,因此我无法在我的包函数中添加foreach::
。
我不确定我需要做些什么才能让它正常工作。此外,我所读到的95%的类似问题是由.packages()
导致错误的遗漏造成的,而不是%dopar%
运算符本身未被识别。这似乎不是原因。
请帮忙!
答案 0 :(得分:1)
快速修复foreach%dopar%的问题是重新安装这些软件包:
install.packages("doSNOW")
install.packages("doParallel")
install.packages("doMPI")
上面的软件包负责R中的并行性。现在删除了旧版本软件包中存在的Bug。我应该提一下,即使您没有直接在项目/包中使用这些包,它也很有可能会有所帮助。