R找不到函数";%“多帕%”;

R找不到函数";%“多帕%”;,r,parallel-processing,R,Parallel Processing,在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)

在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)
}
# Generated by roxygen2 (4.1.1): do not edit by hand

export(doSomething)
如果我从R脚本将函数加载到内存中,这将非常有效;但是,我想把它包含在我正在编写的包中。因此,在包文件中,我会小心地标识外部函数的名称空间,并在
说明
文件中引用它们的包。例如:

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)
}
说明
文件中:

...
Imports:
    foo,
    bar,
    doParallel,
    foreach,
    parallel
(编辑)命名空间
文件包含以下内容:

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)
}
# 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%
运算符本身未被识别。这似乎不是这里的原因


请帮忙

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

install.packages("doSNOW")

install.packages("doParallel") 

install.packages("doMPI")

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

您的描述文件中是否有包含foreach包的“依赖”行。描述文件中的导入行最好位于命名空间文件中。您应该在描述文件中包含这一行:Depends:R(>=2.14.0)、foreach、parallel、doparallel我想您想要
importFrom(foreach,“%dopar%”)在名称空间文件中
这可能不是正确的答案,但您认为R运算符总是需要在其中缀语法中使用值得重新检查。您应该始终能够将其用作
foreach::
%dopar%
(arg1,arg2)
。这就是解析器将其转换为的内容。arg1和arg2将是:
.packages=c(“foo”、“bar”)
工作(a、b、c)