purrr的每一个都不适合is.na

Cet*_*ttt 2 r purrr

我最近使用了purrr包中的每个命令,我不确定它是否按照预期的方式工作:

library(tidyverse)

a <- list(1:3, "a", NA)
every(a, is.na)
[1] FALSE

b <- list(1:10)
every(b, is.na)
[1] TRUE
Run Code Online (Sandbox Code Playgroud)

根据我的理解,每次检查列表中的每个元素是否满足某个条件,在我的情况下,它检查组件是否为NA.在第一种情况下,它正确地返回false,因为只有第三个组件是NA.但在第二种情况下,没有元素等于NA,它返回TRUE.这可能是个错误吗?

Mik*_*ila 6

发生这种情况是因为every期望谓词函数作为第二个参数,即在给定输入的情况下将返回单个逻辑值的函数.

当你应用于is.na中的第一个(也是唯一的)元素时b,1:10你会得到一个10 FALSE秒向量的结果,然后通过测试结果为false rlang::is_false.评估结果是FALSE因为10 FALSEs 的向量与单个向量不同FALSE,这反过来导致every返回TRUE.

如果使用谓词函数,则结果如预期:

every(b, compose(any, is.na))
#> [1] FALSE
Run Code Online (Sandbox Code Playgroud)

但奇怪的是,当使用谓词函数时,如果期望长度为1的参数,则不会收到带有向量参数的警告.可能值得提一下这个问题.