如何检查列表是否包含“NA”?

How to check whether a list contains `NA`?

当右边是向量时,%in%可以用来检查NAs:

> NA %in% c(NA, 2)
[1] TRUE
> NA %in% c(1, 2)
[1] FALSE
> 1 %in% c(NA, 2)
[1] FALSE
> 1 %in% c(1, 2)
[1] TRUE

当右侧是列表时,%in% 表现不同:

> NA %in% list(NA, 2)
[1] FALSE
> NA %in% list(1, 2)
[1] FALSE
> 1 %in% list(NA, 2)
[1] FALSE
> 1 %in% list(1, 2)
[1] TRUE

这是错误还是功能?文档中是否对此进行了描述?

我们可以使用anyNA

anyNA(list(NA, 2))

如果 listvector 长度 > 1,则使用 recursive = TRUE

anyNA(list(c(1, 2), c(NA, 1)), recursive = TRUE)
#[1] TRUE

回答我的第二个问题:是的,这个现象在文档中有描述(当然):

Factors, raw vectors and lists are converted to character vectors [...]

因此,list(NA, 2) 被强制转换为 c("NA", "2")。显然,NA不在c("NA", "2")中。因此,应该使用anyNA

我的个人要点:尽量避免 %in% 右侧由列表组成。