2014-12-08 85 views
17

我遇到了一個小問題,我不知道爲什麼。它是告訴我,這條線:if(temp > data[[k]][[k2]]) {被參數長度0。這裏的是這是不是大的塊:什麼是在數據R - 參數是長度爲零的if語句

for(k in 1:length(data)) { 
     temp <- 0 
     for(k2 in 3:length(data[[k]])) { 
      print(data[[k]][[k2]]) 
      if(temp > data[[k]][[k2]]) { 
       temp <- data[[k]][[k2]] 
      } 
      fMax[k] <- temp 
      k2 <- k2 + 1 
     } 
k <- k + 1 
} 

例如[[K]] [[K2]]:

[1] "3050" 
[1] "3051" 
[1] "3054" 
[1] "3054" 
[1] "3052" 
[1] "3053" 
[1] "3059" 
[1] "3059" 
[1] "3057" 
[1] "3060" 
[1] "3063" 
[1] "3060" 
[1] "3068" 
[1] "3067" 
[1] "3079" 
[1] "3085" 
[1] "3094" 
[1] "3107" 
[1] "3121" 
[1] "3135" 
[1] "3147" 
[1] "3161" 
[1] "3200" 
[1] "3237" 
[1] "3264" 
[1] "3274" 
[1] "3284" 
[1] "3289" 
[1] "3292" 
[1] "3300" 
[1] "3301" 
[1] "3303" 
[1] "3306" 
[1] "3310" 
[1] "3312" 
[1] "3313" 
[1] "3319" 
[1] "3314" 
[1] "3318" 
[1] "3318" 
[1] "3320" 
[1] "3322" 
[1] "3322" 
[1] "3322" 
[1] "3328" 
[1] "3332" 
[1] "3338" 
[1] "3350" 
[1] "3358" 
[1] "3378" 
[1] "3395" 
[1] "3402" 
[1] "3875" 
[1] "3950" 
[1] "3988" 
[1] "4018" 
[1] "4039" 
[1] "4048" 
[1] "4057" 
[1] "4062" 
[1] "4067" 
[1] "4076" 
[1] "4082" 
[1] "4085" 
[1] "4092" 
[1] "4098" 
[1] "4099" 
[1] "4101" 
[1] "4107" 
[1] "4119" 
[1] "4139" 
[1] "4164" 
[1] "4231" 
[1] "4347" 
[1] "4559" 

謝謝 - 山姆

+0

我嘗試了一些重現,但不能。嘗試設置'選項(錯誤=恢復)'當你點擊錯誤時將你轉儲到瀏覽器中。然後打印'k'和'​​k2',仔細看看是否有麻煩的情況。 – 2014-12-08 03:03:31

+2

你真的應該發佈一個[可重現的例子](http://stackoverflow.com/questions/5963269/how-to-make-a-great-r-reproducible-example)樣本輸入和所需的輸出,可以複製/粘貼到R.此外,描述你想要做的,而不是隻發佈破碎的代碼;可能有更好的方法來做到這一點。但是你的代碼在'k2'上有一個'for'循環,所以手動增加這個值是非常奇怪的。 – MrFlick 2014-12-08 03:03:59

+0

好吧我把它作爲一個很好的解釋答案,如果它的困惑讓我知道,但我不是最好的解釋。 – user3558177 2014-12-08 03:13:35

回答

49

「的說法是長度爲零的」是來自於我最不喜歡R的元素之一一個非常具體的問題,讓我來說明問題:

> FALSE == "turnip" 
[1] FALSE 
> TRUE == "turnip" 
[1] FALSE 
> NA == "turnip" 
[1] NA 
> NULL == "turnip" 
logical(0) 

正如您所看到的,與NULL的比較不僅不會產生布爾值,而且它們也不會產生任何值 - 而控制流傾向於期望檢查會產生一些類型的輸出。當他們產生一個零長度的輸出......「參數長度爲零」。

(我有關於爲什麼這激怒了我這麼多了很長的咆哮,可以等待。)

所以,我的問題; sum(is.null(data[[k]]))的輸出是什麼?如果不是0,你已經嵌入在數據集中NULL值,將需要或者刪除相關行,或更改支票

if(!is.null(data[[k]][[k2]]) & temp > data[[k]][[k2]]){ 
    #do stuff 
} 

希望幫助;沒有整個數據集很難說。如果它沒有幫助,並且問題不是在某處出現的NULL值,恐怕我不知道。

+0

或者,查看代碼:您既循環「for」並遞增。結果可能是你最終會引用不存在的數據索引[[k]]。要麼使用for循環,要麼使用while循環增加,而不是兩者; for循環自行增加。 – 2014-12-08 14:30:37

+0

好的謝謝,標記爲答案。 – user3558177 2014-12-08 19:41:19

+4

順便說一句,我們去哪裏讀朗讀? – 2017-08-28 18:21:18

2

相同的錯誤消息不僅針對null,而且還針對例如factor(0)。在這種情況下,查詢必須是if(length(element) > 0 && otherCondition)或使用if(!is.null(element) && length(element) > 0 && otherCondition)檢查兩種情況。