for
ループが別のfor
ループにネストされています。内側のループで何らかの問題が発生したときに、終了して外側のループの次の反復にジャンプするようにするにはどうすればよいですか?
uuu <- 0
for (i in 1:100) {
uuu <- uuu + 1
j <- 1000
for (eee in 1:30) {
j <- j - 1
if (j < 990) {
# if j is smaller than 990 I hope start next time of i
}
}
}
@flodelはこれに対する正しい答えを持っています。つまり、break
ではなくnext
を使用します。残念ながら、その回答の例では、使用された制御フロー構造が同じ結果になります。
2つの構成の動作がどのように異なるかを明確にするために、次の例を追加します。
## Using `break`
for (i in 1:3) {
for (j in 3:1) { ## j is iterated in descending order
if ((i+j) > 4) {
break ## << Only line that differs
} else {
cat(sprintf("i=%d, j=%d\n", i, j))
}}}
# i=1, j=3
# i=1, j=2
# i=1, j=1
## Using `next`
for (i in 1:3) {
for (j in 3:1) { ## j is iterated in descending order
if ((i+j) > 4) {
next ## << Only line that differs
} else {
cat(sprintf("i=%d, j=%d\n", i, j))
}}}
# i=1, j=3
# i=1, j=2
# i=1, j=1
# i=2, j=2 ## << Here is where the results differ
# i=2, j=1 ##
# i=3, j=1 ##
break
を使用すると、Rが内側のfor
ループのループを停止するので、外側のfor
ループの次の反復に進みます。
for (i in 1:10) {
for (j in 1:10) {
if ((i+j) > 5) {
# stop looping over j
break
} else {
# do something
cat(sprintf("i=%d, j=%d\n", i, j))
}
}
}
# i=1, j=1
# i=1, j=2
# i=1, j=3
# i=1, j=4
# i=2, j=1
# i=2, j=2
# i=2, j=3
# i=3, j=1
# i=3, j=2
# i=4, j=1