2014-12-08 2476 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)检查两种情况。