#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
это твой хороший друг. Опубликуйте больше вашего кода и с воспроизводимыми данными, возможно, вы сможете получить лучшую помощь.