【问题标题】:Argument is of length zero in if statementR - if 语句中的参数长度为零
【发布时间】:2020-12-06 19:41:19
【问题描述】:

我在使用 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
 }

数据中的内容示例[[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"

谢谢 - 山姆

【问题讨论】:

  • 我尝试了一点重现,但不能。尝试设置options(error=recover) 以在您遇到错误时将您转储到浏览器中。然后打印kk2 并仔细查看给您带来麻烦的案例。
  • 您确实应该发布reproducible example,其中包含可以复制/粘贴到 R 中的示例输入和所需输出。此外,请描述您要执行的操作,而不仅仅是发布损坏的代码;很可能有更好的方法来做到这一点。但是你的代码在k2 上有一个for 循环非常奇怪,并且还要手动增加值。
  • 好吧,我把它作为一个很好的解释的答案,如果它令人困惑,尽管我不擅长解释,但请告诉我。
  • 您不需要手动增加for 循环,因此请去掉x &lt;- x + 1。对于某些k 和某些k2 可能没有data[[k]][[k2]]
  • 好评!我敢打赌这就是问题所在(请参阅我对 NULL 的漫谈)。

标签: r


【解决方案1】:

“参数长度为零”是一个非常具体的问题,它来自我最不喜欢的 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 值进入某个地方,恐怕我不知道。

【讨论】:

  • 另外,查看代码:您都在使用“for”循环并递增。结果可能是您最终将引用不存在的 data[[k]] 索引。要么使用 for 循环,要么使用 while 循环递增,而不是两者都使用; for 循环会自行递增。
  • 不错的@ben_says ;D
  • nchar(character(0)) 也有同样烦人的问题,它不是零,而是整数 (0)!
  • 注意:将第二个代码块中的 &amp;&amp; 替换为 &amp;。 R 的 &amp; 运算符不会短路,因此建议的方法因与 OP 中相同的原因而失败。
【解决方案2】:

同样的错误信息不仅适用于null,也适用于例如factor(0)。在这种情况下,查询必须是 if(length(element) &gt; 0 &amp; otherCondition) 或更好地使用 if(!is.null(element) &amp; length(element) &gt; 0 &amp; otherCondition) 检查这两种情况。

【讨论】:

    【解决方案3】:

    当您将输出作为长度为 0 的整数而不是 NULL 输出时,会发生长度为零的参数。即, 整数(0)。

    您可以通过查找您的输出类别来进一步验证我的观点 - &gt;class(output) “整数”

    【讨论】:

      【解决方案4】:

      我花了一整天的时间来解决这个问题,结果证明解决方案很简单..

      R 不是零索引。

      我以前使用过的每种编程语言的数据都从 0 开始,R 从 1 开始。 结果是一个错误的错误,但与通常的方向相反。 在数据结构上越界返回 null 并在 if 语句中比较 null 给出参数长度为零的错误。混乱开始是因为数据集不包含任何空值,并且像任何其他编程语言一样从位置 [0] 开始被证明是超出范围的。

      也许从 1 开始对于没有编程经验的人(R 的目标市场?)更有意义,但对于程序员来说,如果你不知道这一点,那就真的是头疼了。

      【讨论】:

        【解决方案5】:

        对于这种情况,您可以使用isTRUEisTRUE{ is.logical(x) &amp;&amp; length(x) == 1 &amp;&amp; !is.na(x) &amp;&amp; x } 相同

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

        • ""

        • 一个空的原子向量

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

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

        • “try-error”类的对象

        • 代表未点击的actionButton()的值

        【讨论】:

        • 多么漂亮的方法!
        【解决方案6】:

        解决问题的最简单方法是更改​​你的 for 循环语句:

        而不是使用

              for (i in **0**:n))
        

        使用

              for (i in **1**:n))
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多