2012-05-28 61 views
14

有2個級別的循環。 如何跳到下一次循環次級循環的子級別發生什麼事情?R語言:如何跳轉到下一個頂級循環?

非常感謝!

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

參見:'next'和'break',但在這裏,我寧願有一個內部循環,如:'爲(1000記者:970){...}' – daroczig

回答

22

想要next。看到它的幫助頁面:?"next"

這是一個愚蠢的例子:

for(i in 1:10) { 
    for(j in 1:10) { 
     if(i < 5 || j <5) { 
      next 
     } else { 
      writeLines(paste("i =", i, " j=", j)) 
     } 
    } 
} 

,並提供:

i = 5 j= 5 
i = 5 j= 6 
i = 5 j= 7 
i = 5 j= 8 
i = 5 j= 9 
i = 5 j= 10 
i = 6 j= 5 
i = 6 j= 6 
i = 6 j= 7 
i = 6 j= 8 
i = 6 j= 9 
i = 6 j= 10 
i = 7 j= 5 
i = 7 j= 6 
i = 7 j= 7 
.... 
7

我想你想使用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 
+1

+1 - 我同意這是OP的問題的正確答案。我只是自己添加了一個答案b/c我希望能更好地強調'next'和'break'的區別。 –

+0

也許只需添加一箇中斷指示符來打破兩個循環 – user1421972

13

@flodel對此有正確答案,即使用break而不是next。不幸的是,無論使用何種控制流構造,該答案中的例子都會得出相同的結果。

我正在添加下面的示例,以清楚說明兩個構造的行爲有何不同。

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