2013-09-07 1 views
2

Я использую функцию foreach() в пакете foreach R для параллельных вычислений. Помимо этой функции, я думаю, что также необходимо использовать функцию registerDoMC() в пакете doMC.ли импортировать «параллельный» пакет в R при использовании foreach

Однако, когда я пишу 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) 

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

ответ

2

Если вы измените файл ОПИСАНИЕ путем добавления doMC к «зависит», то «не может найти ИТЭР функцию» ошибка должна уйти, и функции от foreach, iterators и doMC будет доступна, когда ваш пакет будет загружен, который, кажется, является вашим предпочтением. В первой главе Writing R Extensions обсуждаются различия между «Импорт» и «Зависимости». Как правило, предпочтительнее использовать «Импорт», чтобы не заставлять пользователей вашего пакета загружать пакеты, которые нужны только в пакете, но он использует.

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

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

+0

Большое вам спасибо за решение! Да, это действительно работает, если я поместил doMC в раздел Depends ;-) – alittleboy