2013-06-14 4 views
1

Я запускаю симуляции в R, в для. На каждом шаге цикла, я пытаюсь соответствовать бета-биномиальное распределение с использованием vglm функцию VGAM пакета:R - Перейти к следующему шагу в цикле, когда ошибка

vglm(data ~ 1, betabinomial) 

Однако для некоторых из моих сгенерированных данных, бета-биномиальной модели будет не подходит и функция сработает. Поскольку он выходит из строя, R выходит из цикла и останавливается. Я хотел бы просто перейти к следующему шагу в цикле. Я знаю о функции tryCatch, но не смог использовать ее в моем случае. На данный момент мой код выглядит следующим образом (обратите внимание, что для цикл вложен в другой для цикла):

for (i in 1:nsimu) { 
    ## Some code to generate Pos and Neg 
    data <- cbind(Pos,Neg) 
    if (sum(Pos)==0) { 
     ##Go to next step 
    } 
    else { 
     vglm(data ~ 1, betabinomial) 
    } 
} 

Большое спасибо за любую помощь или предложения.

Stéphane

ответ

6

Вы можете использовать next, чтобы пропустить шаг в for цикле:

R> for (i in 1:5) { if (i==2) next(); print(i)} 
[1] 1 
[1] 3 
[1] 4 
[1] 5 
3

Почему вы не сделать

if (sum(Pos) > 0) 
    vglm(data ~ 1, betabinomial) 

Конструктивно R работает только код на следующей новой строке, если условие оценивается TRUE. Всегда лучше использовать фигурные скобки {} обернуть выражение, чтобы избежать двусмысленности, хотя, и вы можете добавить else условие, чтобы оценить некоторые другие выражения, если Pos==0

if (sum(Pos) > 0){ 
    vglm(data ~ 1, betabinomial) 
} else { 
    do something else 
} 
+0

+1, очевидно, лучше, что нужно делать. – juba

+0

@juba спасибо. Мне интересно, нужен ли здесь вложенный цикл 'for'. –

+0

Благодаря Саймону и Джубе. Однако моя основная проблема заключается в том, что бывают случаи, когда ** sum (Pos)> 0 ** и модель все еще не подходит (и они не определяются i, они определяются данными, поэтому мне нужно попробовать и сначала подгоните модель). Это те случаи, которые я хочу игнорировать. Что касается вложенного цикла * for *, это для другого параметра. –

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