检查列表是否有“任何”NA - 警告

时间:2017-12-12 12:50:35

标签: r list warnings

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

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

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

返回将是布尔值列表。

所以,我需要检查这些元素中是否有任何错误。为此,我正在使用any!any(logic.vet)。但是,它会触发一个R警告,告诉:

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

我试图通过将“”列表转换为向量来解决这个问题:as.vector(logic.vet),但强制转换没有影响变量的结构。它仍然是一个清单。

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

为了提供可重现的示例,我们假设lapply返回

list(TRUE, FALSE)

现在,我如何检查是否有任何错误?

2 个答案:

答案 0 :(得分:1)

考虑

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))]

答案 1 :(得分:1)

无需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)