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))) == 0
是 TRUE
还是 FALSE
。然而,两者都不是,因为它是空的。 if
语句需要 TRUE
或 FALSE
。这就是为什么它给你一个错误 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
这一行:
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))) == 0
是 TRUE
还是 FALSE
。然而,两者都不是,因为它是空的。 if
语句需要 TRUE
或 FALSE
。这就是为什么它给你一个错误 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