if语句中的逻辑(0)

use*_*890 6 if-statement r na

这一行:

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)

efb*_*own 9

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)

  • 因为“类”是面向对象宇宙的术语,而“模式”是(实际上是旧的)R 术语“基本类型”。“基础类型”更好。来自:[Advanced R](https://adv-r.hadley.nz/base-types.html):_从技术上讲,基对象和 OO 对象之间的区别在于 OO 对象具有“类”属性_但也:_您可以听说过 mode() 和 storage.mode()。不要使用这些函数:它们的存在只是为了提供与 S._ 兼容的类型名称 (2认同)

Ada*_*amO 7

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

> any(!is.na(c(NA,NA,NA)))
FALSE
Run Code Online (Sandbox Code Playgroud)


Ken*_*HBS 5

首先,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))) == 0TRUEFALSE.但是,它既不是,因为它是空的.该if语句来需要无论是TRUEFALSE.这就是为什么它会给你一个错误argument is of length zero


use*_*745 5

length()只需像这样使用:

foo <- logical(0)

if(length(foo) == 0) { } # TRUE
if(length(foo) != 0) { } # FALSE
Run Code Online (Sandbox Code Playgroud)