我正在寻找一种方法来检查列表是否包含任何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)
现在,我如何检查是否有任何错误?
答案 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)