2014-10-29 3 views
0

Если я создаю простую модель, Еогеасп возвращает каждый результат так, как я думаю, что он должен:отсутствует выход из Еогеаспа

m=function(i,j){data.frame(i=i,j=j)} 
> foreach(i=1:2, .combine='rbind') %:% foreach(j=1:2, .combine='rbind') %dopar%{ 
+ m(i,j) 
+ } 
    i j 
1 1 1 
2 1 2 
3 2 1 
4 2 2 

, но с использованием более сложной функции пропускает первый цикл:

# Loop through the prediction model (in parallel) with different parameters 
results = foreach(i=1:2, .combine='rbind') %:% foreach(j=1:2, .combine='rbind') %dopar%{ 
    model(i,j) 
} 
> results 
    i j tpr  fpr  rj      day 
1 1 2 0 0.2127812 1.022387 Wed Oct 29 11:53:45 2014 
2 2 1 0 0.2161888 1.023102 Wed Oct 29 11:54:41 2014 
3 2 2 0 0.2127812 1.022387 Wed Oct 29 11:53:45 2014 

Вы можете предположить, что функция генерирует ошибку, когда i = 1, j = 1, но выполнение функции вне цикла foreach дает хороший результат:

> model(1,1) 
    i j tpr  fpr  rj      day 
1 1 1 0 0.2161888 1.023102 Wed Oct 29 12:30:31 2014 

Так что я предполагаю, что я неправильно установил итераторы foreach. Надеюсь, проблема более очевидна для вас, чем для меня.

Редактировать: Он также работает, если% dopar% заменено на% do%. Конечно, это решение поражает цель использования foreach.

+1

Минимальный воспроизводимый пример был бы хорош, чтобы помочь вам отлаживать. Без него и не зная, как определяется «model (i, j)», трудно сказать, в чем проблема. –

+0

Мне не удалось воспроизвести проблему с общими данными. И, фактически, повторное подключение к серверу, похоже, устранило проблему. (Хотя это может снова появиться в будущем.) Я подозреваю, что произошла ошибка из-за памяти, хотя это не было очевидно из подробного вывода. –

+0

Я не могу воспроизвести ваш пример без модели, но, возможно, вы хотите написать 'results = foreach (i = 1: 2, .combine = 'rbind')%:% foreach (j = 1: 2 ')' ie, т.е. без второго комбинировать аргумент? – Jens

ответ

0

Я бы предположил, что «модель» возвращала другой результат при исполнении работником, возможно, потому, что рабочий не был инициализирован правильно.

Чтобы проверить эту теорию, я хотел бы добавить дополнительный код теста:

results <- 
    foreach(i=1:2, .combine='rbind') %:% 
    foreach(j=1:2, .combine='rbind') %dopar% { 
     x <- model(i,j) 
     stopifnot(! is.null(x)) 
     stopifnot(nrow(x) == 1) 
     x 
    } 

Если «модель» всегда возвращает хорошее значение, то ваша теория может быть правильной, хотя это трудно себе представить, как «модель» может вызвать проблему с переменными итерации.

+0

Спасибо за ваше предложение. На этот раз оба результата i = 1 опущены. Мне нужно будет еще немного прочитать о том, как интерпретировать это. –

Смежные вопросы