2

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

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

好像还是报错:mclapply()function is to be used by foreach(),而且这个函数同时出现在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)

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

4

1 回答 1

2

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

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

我向包维护者提交了该doMC错误的修复程序,因此您应该能够在包的下一个版本中导入foreachdoMC进入包而不会出现错误。

于 2013-09-07T23:39:22.397 回答