purrr&x27;It’It’It’It’It’It’It’It’It’It’It’It’It’It’It’It’It’It’It’It’It’

purrr&x27;It’It’It’It’It’It’It’It’It’It’It’It’It’It’It’It’It’It’It’It’It’,r,purrr,R,Purrr,我最近使用了purrr包中的every命令,我不确定它是否按照预期的方式工作: library(tidyverse) a <- list(1:3, "a", NA) every(a, is.na) [1] FALSE b <- list(1:10) every(b, is.na) [1] TRUE 库(tidyverse) 发生这种情况的原因是每个都需要一个谓词函数作为第二个参数,也就是说,一个函数在给定输入时返回一个逻辑值 当您将is.na应用于b,1:10中的第一个(也是唯

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

library(tidyverse)

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

b <- list(1:10)
every(b, is.na)
[1] TRUE
库(tidyverse)

发生这种情况的原因是
每个
都需要一个谓词函数作为第二个参数,也就是说,一个函数在给定输入时返回一个逻辑值

当您将
is.na
应用于
b
1:10
中的第一个(也是唯一的一个)元素时,您会得到一个10
FALSE
s的向量的结果,然后由
rlang::is_FALSE
测试该向量的错误性。它的计算结果为
FALSE
,因为10
FALSE
s的向量与单个
FALSE
不同,这反过来导致
每个
返回
TRUE

如果使用谓词函数,结果与预期一致:

every(b, compose(any, is.na))
#> [1] FALSE

但奇怪的是,当不使用谓词函数时,当需要长度为1的参数时,并没有得到向量参数的警告。关于这一点,可能值得提出一个问题。

感谢您澄清谓词函数的确切含义。我没有意识到这一点。还有一个问题:为什么每个(b,is.character)都正确地返回false这是因为
is.character
没有矢量化:它本质上与说
typeof(x)==“character”
,这使它成为一个谓词相同。我在Purr GitHub repo中对此进行了讨论。
anyNA
是一个(更快的)
compose(any,is.na)的内置替代方案