2015-08-27 71 views
-4

我想停止循環時,如果條件成爲真,並繼續我的代碼的下一行。當我運行這個時,我得到一個錯誤,即塊[[i]]中的下標i超出界限。有任何想法嗎?For循環R(不知道如何停止循環,並繼續我的代碼的其餘部分)

for(i in 1:length(blocks)){ 
    if(length(blocks[[i]]) == 0){ 
    path <- path[ -i , -i] 

    modes = rep("A", nrow(path)) 
    blocks[[i]] = NULL 
    } 
} 

注:我已閱讀for循環的幫助,接下來,停止和中斷

+2

嘗試閱讀'help(「for」)'? (你會了解'next'和'stop') – Cath

+3

不是一個答案,只是一個評論......如果你這樣做了,你應該在問題中提到它。許多人沒有閱讀幫助,你的問題的答案確實在幫助,因此我的「明顯的評論」... – Cath

+2

@詹姆斯馬歇爾不需要諷刺。您的問題中沒有任何內容顯示您已嘗試在下一個/停止/中斷某處。問問你自己是否真的描述了你的問題。並閱讀[如何問](http://stackoverflow.com/help/how-to-ask) – Tensibai

回答

2

如果我理解正確的話,你要循環,當條件爲真,並退出循環當條件爲假。所以你應該使用控制流操作符while,而不是for

i <- 1 
while(i<=length(blocks) & length(blocks[[i]])!=0){ 
    i <- i+1 
} 

# check that we exited the loop because there was a zero 
# and not because we went through all the blocks 
if(i != length(blocks+1)) { 
    path <- path[ -i , -i] 
    modes = rep("A", nrow(path)) 
    blocks[[i]] = NULL 
} 
# rest of your code 

但是這裏真的沒有必要循環。

# apply 'length' to every element of the list blocks 
# returns a vector containing all the lengths 
all_length <- sapply(blocks, FUN=length) 

# check that there is at least one zero 
if(any(all_length==0)) { 
    # find the indexes of the zeros in 'all_length' 
    zero_length_ind <- which(all_length==0) 

    # this is the index of the first zero 
    i <- min(zero_length_ind) 
} 

我不知道你想做的事,但如果你的計劃是把所有的「我」順序,你實際上可能想zero_length_ind工作,並立刻把所有的零。

例如,如果你想與刪除所有值path零長度blocks,你應該直接做:

path <- path[-zero_length_ind,-zero_length_ind] 

(請注意,如果在塊沒有零長度元素,然後zero_length_ind將是integer(0)(也就是一個空整數向量),你不能用它來索引path。這可能爲你節省一些調試時間。)

+0

非常感謝這個主意!我想提及的是,我想發現我的清單的第一個觀察性的觀察並刪除它。例如。 mylist {c(a),c(b),c(c).......}以及當c(a)=字符(o)或mylist [[1]] = 0時,刪除那個 –

+0

運行'while'循環,'i'包含第一個空觀察的索引。當沒有空洞的觀察時,要小心這種情況,那麼在循環之後'i'將會是'length(blocks)+ 1'。 –

+0

但我建議你使用「無迴路」代碼,它也會產生第一個空觀察值的索引。由於基本操作是矢量化的,因此在R中使用循環時效率會更高,並且它很糟糕。當沒有空觀察時,要小心這種情況,你應該檢查all_length是否至少包含一個零。 –

0

使用STOP命令,下面的代碼應該工作

for(i in 1:length(blocks)){ 
     if(length(blocks[[i]]) == 0){ 
      path <- path[ -i , -i] 

      modes = rep("A", nrow(path)) 
      blocks[[i]] = NULL 
    `  stop("Outside bounds") 


     } 

     } 
+0

謝謝你的幫助。說實話,這完全停止了我想要的循環,但我可以讓循環後說十多行,我想找到一種方法來繼續這一行。任何建議? –

0

我有麻煩解析您的標題和你的描述。在我看來,你不想停止循環,但繼續你的對象的整個長度blocks。這可以幫助,應該跳到下一個迭代時,長度爲0是不同的:

for(i in 1:length(blocks)){ 
    if(length(blocks[[i]]) != 0) { 
    next 
    } else if(length(blocks[[i]]) == 0){ 
    path <- path[ -i , -i] 

    modes = rep("A", nrow(path)) 
    blocks[[i]] = NULL 
    } 
}