R语句在if语句中的长度为零

use*_*177 38 r

我对R有点问题,我不知道为什么.它告诉我这一行:if(temp > data[[k]][[k2]]) {参数长度为0.这里的块不是那么大:

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
 }
Run Code Online (Sandbox Code Playgroud)

数据[[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"
Run Code Online (Sandbox Code Playgroud)

谢谢 - 山姆

Oli*_*yes 96

"参数长度为零"是一个非常具体的问题,来自我最不喜欢的R元素之一.让我演示一下这个问题:

> FALSE == "turnip"
[1] FALSE
> TRUE == "turnip"
[1] FALSE
> NA == "turnip"
[1] NA
> NULL == "turnip"
logical(0)
Run Code Online (Sandbox Code Playgroud)

正如您所看到的,与NULL的比较不仅不会产生布尔值,它们根本不会产生值 - 并且控制流倾向于期望检查会产生某种输出.当它们产生零长度输出时......"参数的长度为零".

(我有很长时间的咆哮,为什么这会让我如此激怒.它可以等待.)

所以,我的问题; 什么是输出sum(is.null(data[[k]]))?如果它不是0,则在数据集中嵌入NULL值,并且需要删除相关行,或者将检查更改为

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

希望这会有所帮助; 没有整个数据集很难说清楚.如果它没有帮助,并且问题不是某个地方的NULL值,我恐怕我不知道.


Som*_*ing 14

相同的错误消息不仅导致,null而且也导致例如factor(0).在这种情况下,查询必须if(length(element) > 0 & otherCondition)或更好地检查两种情况if(!is.null(element) & length(element) > 0 & otherCondition).


Flo*_*ian 8

您可以isTRUE用于此类情况。isTRUE是相同的{ is.logical(x) && length(x) == 1 && !is.na(x) && x }

如果你在那里使用闪亮,你可以使用isTruthy它涵盖以下情况:

  • 错误的

  • 空值

  • “”

  • 一个空的原子向量

  • 仅包含缺失值的原子向量

  • 包含所有 FALSE 或缺失值的逻辑向量

  • 类“尝试错误”的对象

  • 表示未单击的 actionButton() 的值