Как вы можете видеть в коде Python ниже, если условие выполняется, итерация пропускает 1, 5 и 9.
range_iter = iter(range(10))
for i in range_iter:
print(i)
if i % 4 == 0:
next(range_iter)
print('Condition satisfied',i)
0
Condition satisfied 0
2
3
4
Condition satisfied 4
6
7
8
Condition satisfied 8
Я попробовал это. Но это было бесполезно.
library(iterators)
range_iter <- iterators::iter(0:9)
for (i in range_iter) {
if (i %% 4 == 0) {
next(range_iter)
print(paste("Condition satisfied",i))
}
}
Я получаю ошибку:Error in i%%4 : non-numeric argument to binary operator
Как я могу сделать это в R?
Синтаксис модоло в R: %%
:
for (i in seq(0,10)) {
if (i%%4==0) {
print(paste("Condition satisfied",i))
}else{
print(i)
}
}
[1] "Condition satisfied 0"
[1] 1
[1] 2
[1] 3
[1] "Condition satisfied 4"
[1] 5
[1] 6
[1] 7
[1] "Condition satisfied 8"
[1] 9
[1] 10
поскольку R по умолчанию использует индекс на основе 1, поэтому
если вы хотите 0 на основе, вы должны указать это в итераторе
Это правда, но большая временная свинья, потому что вы делаете if
каждый раз в цикле
В R нет команды для пропуска следующей итерации. Оператор next
(сам по себе, а не вызов функции, такой как next(range_iter)
) пропустит текущий.
Итак, чтобы сделать то, что вы хотите, вы должны написать цикл следующим образом:
skip <- FALSE
for (i in 0:9) {
if (skip) {
skip <- FALSE
next
}
print(i)
if (i %% 4 == 0) {
skip <- TRUE
print(paste("Condition satisfied",i))
}
}
#> [1] 0
#> [1] "Condition satisfied 0"
#> [1] 2
#> [1] 3
#> [1] 4
#> [1] "Condition satisfied 4"
#> [1] 6
#> [1] 7
#> [1] 8
#> [1] "Condition satisfied 8"
Created on 2023-01-14 with reprex v2.0.2
Большое спасибо за ваш ответ. У меня есть еще один вопрос. Что делать, если я хочу пропустить более одной итерации, что мне тогда делать?
Я думаю, что для такой сложной ситуации петля for
неуместна. Вы можете поместить все индексы в вектор и удалить их по мере обработки или когда вы видите, что их нужно пропустить, а затем запустить все это как while(length(indices) > 0) { i <- indices[1], .... }
.
Или, может быть, сохранить вектор будущих пропусков вместо одного, как в моем ответе. Тест становится if (i %in% skips) next
. Это все еще будет работать с циклом for
.
Это плохой способ сделать это.
Вам, как правило, гораздо лучше создавать желаемые индексы априори,
такой как
idx <- seq(0,10) %% 4
idx <- idx[idx > 0]
for (jdx in idx) { do_stuff}
Или, конечно, если вам нужны только нулевые значения,
idx <- seq(0,10) %% 4
idx <- which(idx == 0 )
Той же командой:
next
.