我最近使用了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.这可能是个错误吗?
发生这种情况是因为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的参数,则不会收到带有向量参数的警告.可能值得提一下这个问题.