R: Разрыв для цикла

#r #for-loop #break

#r #для цикла #прерывание

Вопрос:

Можете ли вы подтвердить, отменяет ли следующий разрыв внутренний цикл 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,])
       }
      }
    }
  

Комментарии:

1. Если у вас возникли проблемы с этим кодом, обратите внимание, что in это зарезервированное слово, поэтому вы не можете использовать его в качестве имени переменной.

Ответ №1:

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

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
        }   
    }
}
  

Ответ №2:

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

Лично я всегда осторожно отношусь к операторам break и дважды проверяю это, выводя на консоль, чтобы дважды проверить, действительно ли я вырываюсь из правильного цикла. Итак, перед тестированием добавьте следующую инструкцию, которая сообщит вам, если вы прервете цикл до того, как он достигнет конца. Однако я понятия не имею, как вы обрабатываете переменную 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,])
    }
}
  

Комментарии:

1. Большое вам спасибо! Я думаю, что это правда, это прерывается. Мои сомнения вызваны главным образом тем, что я сравниваю два фрейма данных примерно с 30000 строками и проверяю, есть ли новые строки данных или удаленные строки. На то, чтобы заставить его работать, уходят часы. Я делаю это с циклами, подобными этому, и это может быть способом сделать это быстрее? Еще раз спасибо за вашу драгоценную помощь

2. вам нужно векторизовать свою логику. допустим, у вас есть вектор чисел, равный 1-10 vector = c(1:10) , и вы хотите вычесть 1 из каждого элемента. Не делайте этого с помощью цикла for! Просто сделайте следующее vector = vector - 1 . Вам придется все переписать и переосмыслить свою логику. посмотри на ?apply это твой хороший друг. Опубликуйте больше вашего кода и с воспроизводимыми данными, возможно, вы сможете получить лучшую помощь.