【问题标题】:Why does is.na() return TRUE on the first element of an empty vector in R?为什么 is.na() 在 R 中的空向量的第一个元素上返回 TRUE?
【发布时间】:2021-07-31 09:49:33
【问题描述】:

所以我被要求编写一个返回向量(特别是字符向量)的函数。 当向量为 NA 时,我应该打印一些东西。 当我检查一个我知道是空的向量时:

is.na(foo)

我明白了-

logical(0)

但是当我检查时:

is.na(foo[1])

我明白了

TRUE

这是为什么呢?

编辑 -

有人问我foo的来源是什么:

它来自库dplyr中的那个函数filter

state_name_vec <- filter(uscities, city == city_name)$state_name

我可以得到一个字符向量,一个字符(即其他语言中的字符串),或者,我猜是一个空字符向量。我想我也可以获得一个 data.frame,但就我而言,我没有。

我试图了解 .data 类型是什么意思,过滤器返回。

谷歌搜索后,我得到了这个:

所以我想我的问题是当.data 为空时会发生什么?

【问题讨论】:

  • 你是如何定义foo 的,比如foo &lt;- character() 或?
  • ?'[' 表示带有NA 的子集,例如foo[NA], “选择一个未知元素并返回 NA”。没有提到通过不存在的整数索引进行索引,但我猜返回的逻辑是相同的。如果您使用[“选择未知元素”,则返回NA

标签: r vector na is-empty


【解决方案1】:

如果fooNULL,那么在这两种情况下都会返回logical(0) foo[1]NULL

foo <- c()
foo[1]
#NULL
is.na(foo)
#logical(0)
is.na(foo[1])
#logical(0)

根据?NULL

NULL 可以以几乎任何语法上合法的方式被索引(参见Extract):无论它是否有意义,结果总是NULL。值为 NULL 的对象可以通过替换运算符进行更改,并将强制转换为右侧的类型。


但是,如果创建的对象是以下之一(如 cmets 中所述)

foo <- character()
foo <- numeric()
foo <- integer()

向量的length 为 0 且不为 NULL。因此,如果我们尝试通过指定索引来提取值,它会被相应的NA 填充。基于?Extract

提取时,数字、逻辑或字符 NA 索引选择未知元素,因此在逻辑、整数、数字、复数或字符结果的相应元素中返回 NA,对于列表返回 NULL。 (对于原始结果,它返回 00。)

foo[1]
#[1] NA
foo[1:3]
#[1] NA NA NA
foo[4]
#[1] NA

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-05-15
    • 2020-08-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多