我正在使用foreach()
foreach
中的函数用于并行计算的 R 包。除了这个功能之外,我认为还需要使用 registerDoMC()
doMC
中的函数包裹。
但是,当我写下我的DESCRIPTION
时文件,Imports
部分包含 doMC (>= 1.3.0), foreach (>= 1.4.1)
,但是当我运行代码时,出现错误指示: 找不到 iter
功能。于是,我也import
iterators
包裹。
看来还是有错误:mclapply()
函数由 foreach()
使用,并且此函数出现在 parallel
的两者中和 multicore
包裹。我将这两个包都包含在 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
iterators
的两个包和multicore
,在加载我自己的包后我仍然无法使用它们的功能...相反,我必须显式运行:
library(iterators)
library(multicore)
为了在我的包中使用我自己的函数,该函数利用并行计算。我的包裹写的有问题吗?非常感谢!
最佳答案
如果您通过将 doMC
添加到“Depends”来修改您的描述文件,那么“找不到 iter 函数”错误就会消失,并且来自 foreach
的函数、 iterators
和 doMC
将在您的包加载时可用,这似乎是您的偏好。第一章Writing R Extensions讨论“导入”和“依赖”之间的区别。一般来说,最好使用“导入”以避免强制包的用户加载仅在包内需要的包,但它有用途。
实际上,您看到的“找不到 iter 函数”错误是由 doMC
包中的错误引起的,使用“Depends”而不是“Imports”可以解决此错误。您的包应该只需要导入它直接使用的包,因此如果您没有显式调用 iter
或 mclapply
,则不必导入 迭代器
、并行
或多核
。由于 parallel
包含了 multicore
,因此您永远不应该同时导入 parallel
和 multicore
,这样应该避免出现警告消息你看到的。
我向软件包维护者提交了 doMC
错误的修复程序,因此您应该能够将 foreach
和 doMC
导入到软件包中,而无需包的下一版本中出现错误。
关于r - R中使用foreach时是否导入 "parallel"包,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18670180/