R: перерыв для цикла - PullRequest
55 голосов
/ 21 мая 2011

Можете ли вы подтвердить, отменяет ли следующий перерыв внутренний цикл for?

   for (out in 1:n_old){

     id_velho <- old_table_df$id[out]
      for (in in 1:n)
      {
       id_novo <- new_table_df$ID[in]
       if(id_velho==id_novo)
       {
        break
       }else 
       if(in == n)
       {
       sold_df <- rbind(sold_df,old_table_df[out,])
       }
      }
    }

Ответы [ 2 ]

90 голосов
/ 21 мая 2011

Ну, ваш код не воспроизводится, поэтому мы никогда не узнаем наверняка, но вот что help('break') говорит:

прерывает цикл for, while или repeat;управление передается первому оператору вне самого внутреннего цикла.

Так что да, break только разрывает текущий цикл.Вы также можете увидеть это в действии, например:

for (i in 1:10)
{
    for (j in 1:10)
    {
        for (k in 1:10)
        {
            cat(i," ",j," ",k,"\n")
            if (k ==5) break
        }   
    }
}   
23 голосов
/ 21 мая 2011

ваш оператор прерывания должен выходить за пределы for (in in 1:n).

Лично я всегда настороженно отношусь к операторам прерывания и перепроверяю его, печатая на консоли, чтобы дважды проверить, действительно ли я выбиваю изправая петля.Поэтому перед тестированием добавьте следующее утверждение, которое сообщит вам, если вы прервитесь, прежде чем оно достигнет конца.Однако я понятия не имею, как вы обрабатываете переменную n, поэтому я не знаю, будет ли она вам полезна.Сделайте n какое-нибудь тестовое значение, если вы знаете заранее, должно ли оно пробиться или нет до достижения n.

for (in in 1:n)
{
    if (in == n)         #add this statement
    {
        "sorry but the loop did not break"
    }

    id_novo <- new_table_df$ID[in]
    if(id_velho==id_novo)
    {
        break
    }
    else if(in == n)
    {
        sold_df <- rbind(sold_df,old_table_df[out,])
    }
}
...