if语句中的逻辑(0)

时间:2018-02-05 15:42:23

标签: r if-statement na

这一行:

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)

4 个答案:

答案 0 :(得分:6)

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

答案 1 :(得分:5)

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

答案 2 :(得分:3)

像这样简单地使用length()

foo <- logical(0)

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

答案 3 :(得分:2)

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

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