这一行:
which(!is.na(c(NA,NA,NA))) == 0
Run Code Online (Sandbox Code Playgroud)
产生 logical(0)
虽然这一行
if(which(!is.na(c(NA,NA,NA))) == 0){print('TRUE')}
Run Code Online (Sandbox Code Playgroud)
产生:
Error in if (which(!is.na(c(NA, NA, NA))) == 0) { :
argument is of length zero
Run Code Online (Sandbox Code Playgroud)
为什么会出错?什么是逻辑(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)
Run Code Online (Sandbox Code Playgroud)
在下一行中,您要问的是零长度向量logical(0)是否等于0,而不是.您收到错误是因为您无法将0长度的向量与标量进行比较.
相反,你可以检查第一个向量的长度是否为0:
if(length(which(!is.na(c(NA,NA,NA)))) == 0){print('TRUE')}
Run Code Online (Sandbox Code Playgroud)
调用which检查逻辑向量是否全部为假是一个坏主意。which为您提供 TRUE 值的索引向量。如果没有,则该向量的长度为 0。一个更好的主意是利用any.
> any(!is.na(c(NA,NA,NA)))
FALSE
Run Code Online (Sandbox Code Playgroud)
首先,logical(0)表示您有一个应该包含布尔值的向量,但该向量的长度为零.
在你的第一种方法中,你做到了
!is.na(c(NA, NA, NA))
# FALSE, FALSE, FALSE
Run Code Online (Sandbox Code Playgroud)
使用which()此向量,将生成一个空整数向量(integer(0)).测试空集是否等于零将因此导致空布尔向量.
在你的第二个办法,你试试,看矢量是否which(!is.na(c(NA,NA,NA))) == 0是TRUE或FALSE.但是,它既不是,因为它是空的.该if语句来需要无论是TRUE或FALSE.这就是为什么它会给你一个错误argument is of length zero
length()只需像这样使用:
foo <- logical(0)
if(length(foo) == 0) { } # TRUE
if(length(foo) != 0) { } # FALSE
Run Code Online (Sandbox Code Playgroud)