这一行:
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 :(得分: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))) == 0
是TRUE
还是FALSE
。但是,它既不是,因为它是空的。 if
- 语句需要TRUE
或FALSE
。这就是为什么它会给您一个错误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