2016-12-30 39 views
1

所以我有一個矩陣模型我運行,並在模型被告知要停止我得到一個消息,說「錯誤:」獲取「錯誤」消息,當我跑我的R中循環

現在模型運行良好,當它應該等於停止它時。但這意味着我不能在循環中多次運行它,這並不理想。所以我想知道是否有辦法讓這個錯誤信息停止發生,或繞過它。

假下面的代碼:

n.steps <- 100 
x <- array(0,c(85,n.steps)) 
mnalph<-50 

x[12,]<-2 
x[24,]<-2 
x[40,]<-3 
x[50,]<-1 
x[70,]<-2 
x[85,] <- 1 

k<-0 

for (i in 2:n.steps){ 
    k<-k+1 

    a<-sample(c(replicate(1000, 
         sample(c(1,0), prob=c(0.75, 0.25), size = 1))),1) 
    mat[85,85] <- a 
    currclass <- replacementclass <- round(rnorm(1, mean = mnalph, sd = 11)) 
    if (a == 0) { 

    d <- sample(1:100, 1) 
    if (d > 60) { 
     x[85,k]<-0 
     stop() 

    } else { 

     while(a == 0) { 
     while (a == 0) { 
      if (x[currclass, k] > 1) { 

      x[currclass, k] <- x[currclass, k] - 1 
      a <- 1 
      x[85,k]<-a 

      } else { 

      nonzeroes<-which(x[0:84,k]>0) 
      distances<-abs(nonzeroes - currclass) 
      minlocs<-nonzeroes[which(distances==min(distances))] 
      replacementclass<-minlocs 
      if(x[replacementclass, k]>=1){ 
       x[replacementclass, k]<- x[replacementclass, k] - 1} 
      else { 
       x[replacementclass, k]<- 0} 
      a <- 1 
      x[85,k]<-a 

      if (all(x[11:84, k] == 0)) { 
       stop() 
      } 
      } 
     } 
     } 
    } 
    } 
} 
+1

我得到的錯誤是'k.vec [i] < - k:object'k.vec'找不到'的錯誤,實際上你的代碼沒有任何叫做k.vec的東西。你是否想初始化它 - 也許用'k.vec = NULL'。順便說一句,它看起來像你也參考其他變量,a.vec和mat,這是永遠不會創建的。 – G5W

回答

15

stop()總是返回an error message

stop stops execution of the current expression and executes an error action.

如果你想打破循環,與break更換。

有關詳細信息,請參閱?Control

您的示例沒有運行(例如,k.veca.vec缺少一些對象定義),但我懷疑這個簡單的替換方法會起作用。

+1

感謝你 - 愚蠢地忘記刪除它,它只是爲了診斷目的,現在就這樣做了。 – redferry

+4

好,謝謝你,我認爲這是有幫助的。更好地說,爲什麼代碼不工作,而不僅僅是給出答案,所以謝謝,並指出虛擬代碼不起作用。 – redferry

+3

'stop()'函數還需要參數來產生錯誤消息。這可能是診斷該_specific_行是否產生錯誤的有用方法。 (例如'stop(「all(x [11:84,k] == 0)條件滿足。」)') –