2012-03-05 48 views
-1

此代碼產生一個錯誤丟失的值:該R代碼產生其中TRUE/FALSE錯誤

Error in while (diff < limit) { : missing value where TRUE/FALSE needed

i <- 1 
j <- 1 
limit <- 0.05 
diff <- 0 
ppm <- rep(NA,20) 
while(i[1]<=nrow(list)) 
{ 
    while(diff < limit) ##This is where the error is occurring 
    { 
    if(j==0) 
     ppm <- rep(NA,length(ppm)) 
    ppm[j] <- list$ppm[i]  
    j <- j+1 
    if(j > 1) 
     diff <- ppm[j]-ppm[j-1] 
    } 
    print(ppm) 
} 

現在我已經發現,這通常是因爲在當條件被評估,以NA且因此而不能檢查TRUE/FALSE。但在這種情況下,我真的不知道錯誤是什麼。

+3

'調試'標籤是關於調試的問題。這不是你希望我們爲你做調試的地方。 – 2012-03-05 21:37:28

+0

沒有意識到這一點。現在刪除標籤。 – 2012-03-06 13:25:03

+0

如果你想重新打開這個問題,你可以嘗試將它改寫爲「怎麼樣去調試這類問題」? (提示:如果手動跟蹤邏輯沒有這樣做,用'cat'調試語句如下所示可以提供幫助。) – 2012-03-06 13:37:49

回答

3

關於你的第一次通過while循環:

  • j是1,ppm[1]獲取設置爲的list$ppm
  • 的第i(第一)元件被遞增爲2
  • j現在> 1,所以你拿這仍然是NA,因爲ppm被初始化爲NAppm[2]尚未觸及和ppm[1]ppm[2]之間的差異;結果是NA

現在用limit(固定爲0.05)......咚回到while循環的頂部和比較diff(現NA)。

i <- 1 
j <- 1 
limit <- 0.05 
diff <- 0  ## diff() is a built-in, probably avoid ... 
ppm <- rep(NA,20) 
list <- data.frame(ppm=1:10) ## list is a built-in, probably avoid ... 
while(i[1]<=nrow(list)) ## why i[1] ??? why not just i ??? 
{ 
    while(diff < limit) ##This is where the error is occurring 
    { 
    if(j==0) ## as DWin says: never true, j is initialized to 1 
     ppm <- rep(NA,length(ppm)) 
    ppm[j] <- list$ppm[i]  
    j <- j+1 
    if(j > 1) { ## always true if j is initialized to 1 and incremented the first time 
     diff <- ppm[j]-ppm[j-1] ## will be NA if ppm[j-1] is NA 
     cat(j,ppm[j-1],ppm[j],diff,"\n") ## debugging statement! 
    } 
    } 
    print(ppm) 
} 
3

據我所知,ppm不會在while(){}內初始化,因爲'j'永遠不會== 0。我也看不到'我'在哪裏增加。 (你可能會考慮提供head(list$ppm)

我想我可能是錯在這裏(因爲你從來沒有描述的目標),但也許你真正想要的是:

diff.ppm <- diff(list$ppm) 
diff.ppm[1:which.min(diff.ppm >= limit)]