R找不到功能"%dopar%"

hen*_*dra 7 parallel-processing r

在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)
}
Run Code Online (Sandbox Code Playgroud)

如果我从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)
}
Run Code Online (Sandbox Code Playgroud)

并在DESCRIPTION文件中:

...
Imports:
    foo,
    bar,
    doParallel,
    foreach,
    parallel
Run Code Online (Sandbox Code Playgroud)

(编辑)该NAMESPACE文件包含以下内容:

# Generated by roxygen2 (4.1.1): do not edit by hand

export(doSomething)
Run Code Online (Sandbox Code Playgroud)

问题是,当我构建我的包并从包中运行该函数时,我得到以下错误并执行停止:

Error in doSomething(a, b, c):
    could not find function "%dopar%"
Run Code Online (Sandbox Code Playgroud)

既然%dopar%是一个操作符,而不是一个函数,我不能foreach::在我的包函数中添加它.

我不确定我需要做些什么才能让它正常工作.此外,我所读到的95%的类似问题都是由于遗漏.packages()导致错误造成的,而不是%dopar%操作员本身未被识别.这似乎不是原因.

请帮忙!

小智 1

foreach %dopar% 问题的快速修复是重新安装这些软件包:

install.packages("doSNOW")

install.packages("doParallel") 

install.packages("doMPI")
Run Code Online (Sandbox Code Playgroud)

上述包负责 R 中的并行性。这些包的旧版本中存在的错误现已删除。我应该提到,即使您没有直接在项目/包中使用这些包,它也很可能会有所帮助。