if 语句中的 logical(0)

logical(0) in if statement

这一行:

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)

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')}

首先,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

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

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

只需像这样使用length()

foo <- logical(0)

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