【问题标题】:whether to import "parallel" package in R when using foreach使用foreach时是否在R中导入“并行”包
【发布时间】:2013-09-07 05:43:57
【问题描述】:

我正在使用foreach R 包中的foreach() 函数进行并行计算。除了那个函数,我认为还需要在doMC 包中使用registerDoMC() 函数。

但是,当我编写DESCRIPTION 文件时,Imports 部分包含doMC (>= 1.3.0), foreach (>= 1.4.1),但是当我运行我的代码时,错误指示:找不到iter 函数。因此,我还 import iterators 包。

好像还是有错误:mclapply()函数要被foreach()使用,而这个函数both出现在parallelmulticore包中。我在Imports 部分中包含了这两个包,但是当我运行search() 时,会出现警告:

Warning messages:
1: replacing previous import ‘mclapply’ when loading ‘parallel’ 
2: replacing previous import ‘mcparallel’ when loading ‘parallel’ 
3: replacing previous import ‘pvec’ when loading ‘parallel’ 

这很奇怪:即使我明确imports iteratorsmulticore 的两个包,在加载我自己的包后我仍然无法使用它们的功能......相反,我必须明确运行:

library(iterators)
library(multicore)

为了在我的包中使用我自己的函数,它利用了并行计算。我的包裹写作有什么问题吗?非常感谢!

【问题讨论】:

    标签: r foreach parallel-processing domc


    【解决方案1】:

    如果您通过将doMC 添加到“Depends”来修改您的DESCRIPTION 文件,那么“找不到iter 函数”错误应该会消失,来自foreachiteratorsdoMC 的函数将是加载包时可用,这似乎是您的偏好。 Writing R Extensions 的第一章讨论了“Imports”和“Depends”之间的区别。通常,最好使用“导入”以避免强制您的包的用户加载仅在包中需要但它有用途的包。

    实际上,您看到的“找不到 iter 函数”错误是由 doMC 包中的错误引起的,使用“Depends”而不是“Imports”可以解决此错误。你的包应该只需要导入它直接使用的包,所以如果你没有明确地调用itermclapply,你不应该导入iteratorsparallelmulticore。并且由于parallel 已包含multicore,因此您永远不应同时导入parallelmulticore,这应该可以避免您看到的警告消息。

    我已向软件包维护者提交了针对 doMC 错误的修复,因此您应该能够在下一版本的软件包中将 foreachdoMC 导入软件包而不会出现错误。

    【讨论】:

    • 非常感谢您的解决方案!是的,如果我将 doMC 放在 Depends 部分中,它确实有效;-)
    猜你喜欢
    • 2020-03-08
    • 2015-09-28
    • 2014-08-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-07-24
    相关资源
    最近更新 更多