【问题标题】:logical(0) in if statementif 语句中的逻辑(0)
【发布时间】:2018-07-15 12:33:12
【问题描述】:

这一行:

which(!is.na(c(NA,NA,NA))) == 0

产生logical(0)

这一行

if(which(!is.na(c(NA,NA,NA))) == 0){print('TRUE')}

生成:

Error in if (which(!is.na(c(NA, NA, NA))) == 0) { : 
  argument is of length zero

为什么会出现错误?什么是逻辑(0)

【问题讨论】:

  • 一个长度为 0 的逻辑(即布尔)向量。由于它的长度为零,它没有真值,所以 if 子句失败。
  • 你可以这样做:if(any(!is.na(c(NA,NA,NA))) == 0){print('TRUE')}
  • 如果您将which 替换为sum,您将获得预期的行为,即if(sum(!is.na(c(NA,NA,NA))) == 0){print('TRUE')}

标签: r if-statement na


【解决方案1】:

logical(0) 是一个长度为 0 的基本类型的逻辑向量。你得到这个是因为你问这个向量的哪些元素等于 0:

> !is.na(c(NA, NA, NA))
[1] FALSE FALSE FALSE
> which(!is.na(c(NA, NA, NA))) == 0
logical(0)

在下一行中,您将询问零长度向量 logical(0) 是否等于 0,而事实并非如此。您收到错误是因为您无法将长度为 0 的向量与标量进行比较。

相反,您可以检查第一个向量的长度是否为 0:

if(length(which(!is.na(c(NA,NA,NA)))) == 0){print('TRUE')}

【讨论】:

  • “逻辑类向量”我认为应该是“模式逻辑向量”。
  • @DavidTonhofer 为什么你认为它应该是模式而不是类?
  • 因为“类”是面向对象宇宙的术语,但“模式”是(实际上是旧的)R 术语“基本类型”。 “基本类型”更好。来自:Advanced R从技术上讲,基础对象和 OO 对象之间的区别在于 OO 对象具有“类”属性还有:您可能听说过 mode() 和 storage.mode ()。不要使用这些函数:它们的存在只是为了提供与 S 兼容的类型名称。
  • 好的,谢谢你的建议。我已将“类”更改为“基本类型”,因为它似乎是三者中的最佳选择。
【解决方案2】:

首先,logical(0) 表示您有一个应该包含布尔值的向量,但该向量的长度为零。

在你的第一种方法中,你这样做

!is.na(c(NA, NA, NA))
# FALSE, FALSE, FALSE

在这个向量上使用which(),将产生一个空整数向量(integer(0))。测试一个空集是否等于零,将因此导致一个空的布尔向量。

在您的第二种方法中,您尝试查看向量which(!is.na(c(NA,NA,NA))) == 0TRUE 还是FALSE。然而,两者都不是,因为它是空的。 if-语句需要TRUEFALSE。这就是为什么它会给你一个错误argument is of length zero

【讨论】:

    【解决方案3】:

    调用which 来检查逻辑向量是否全为假是个坏主意。 which 为您提供 TRUE 值的索引向量。如果没有,则该向量的长度为 0。更好的办法是使用any

    > any(!is.na(c(NA,NA,NA)))
    FALSE
    

    【讨论】:

      【解决方案4】:

      像这样简单地使用length()

      foo <- logical(0)
      
      if(length(foo) == 0) { } # TRUE
      if(length(foo) != 0) { } # FALSE
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-03-12
        • 2010-11-17
        • 2021-01-08
        相关资源
        最近更新 更多