检查列表是否有 `any` NA - 警告

Checking if a list has `any` NA - warning

我正在寻找一种方法来检查列表是否包含任何 NA 元素,而不使用 for 循环。另外,如果可能,了解警告的原因。

这是我当前的上下文:我正在使用 lapply 检查 possible.existing.files 中的所有文件是否确实存在。

logic.vet <- lapply(possible.existing.files, file.exists)

return 将是一个布尔值列表。

因此,我需要检查这些元素中是否有任何元素为 FALSE。为此,我使用 any: !any(logic.vet)。然而,它触发了一个 R 警告,告诉:

Warning message:
In any(logic.vet) : coercing argument of type 'list' to logical

我试图通过 "casting" 列表到向量来解决这个问题,如:as.vector(logic.vet),但是 cast 对变量的结构没有影响。它仍然是一个列表。

最后,any还有其他选择吗?目前,我正在使用 options(warn = 0) 来隐藏警告,但它似乎不正确。


只是为了提供一个可重现的例子,让我们假设 lapply return 一个

list(TRUE, FALSE)

现在,如何检查是否有假?

考虑

test <- list(T, F, T)

> test
[[1]]
[1] TRUE

[[2]]
[1] FALSE

[[3]]
[1] TRUE

要查看是否有 FALSE 个元素,请使用

> !unlist(test)
[1] FALSE  TRUE FALSE

现在,要获取所有 FALSE 个元素的位置,只需使用

> which(!unlist(test))
[1] 2

要取消选择 FALSE 个元素,因此使用

possible.existing.files[-which(!unlist(logic.vet))]

不需要lapply()file.exists() 是向量化的,即它接受一个向量作为输入。

files <- c("test1.txt", "test2.txt", "test3.txt", "test4.txt")
file.create(files)

# Just to check visually
list.files(pattern="^test")

possible.existing <- c("foo", files, "bar.zip")

# Any files not existing?
any(!file.exists(possible.existing))

# Which?
possible.existing[!file.exists(possible.existing)]

file.remove(files)