импортировать ли параллельный пакет в R при использовании foreach

Я использую функцию 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)

чтобы использовать мою собственную функцию в моем пакете, который использует параллельные вычисления. Что-то не так в написании моего пакета? Большое спасибо!


person alittleboy    schedule 07.09.2013    source источник


Ответы (1)


Если вы измените свой файл DESCRIPTION, добавив doMC в «Зависит», то ошибка «невозможно найти функцию iter» должна исчезнуть, а функции из foreach, iterators и doMC будут доступны при загрузке вашего пакета, что кажется ваше предпочтение. В первой главе Написание расширений R обсуждаются различия между "Импортами " и "Зависит". Как правило, предпочтительнее использовать «Импорт», чтобы не заставлять пользователей вашего пакета загружать пакеты, которые необходимы только внутри пакета, но у него есть применение.

На самом деле ошибка «не удается найти функцию iter», которую вы видели, вызвана ошибкой в ​​​​пакете doMC, и использование «Зависит», а не «Импорт», помогает обойти эту ошибку. Ваш пакет должен импортировать только те пакеты, которые он использует напрямую, поэтому, если вы явно не вызываете iter или mclapply, вам не нужно импортировать iterators, parallel или multicore. И поскольку parallel включает в себя multicore, вы никогда не должны импортировать одновременно parallel и multicore, что позволит избежать предупреждающих сообщений, которые вы видели.

Я отправил исправление ошибки doMC сопровождающему пакета, так что вы сможете импортировать foreach и doMC в пакеты без ошибок в следующей версии пакета.

person Steve Weston    schedule 07.09.2013
comment
Большое спасибо за решение! Да, это действительно работает, если я поставлю doMC в секцию Depends ;-) - person alittleboy; 08.09.2013