is.na 每个都不能正常工作
purrr's every doesnt work well with is.na
我最近使用了 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
在我的理解中,every 检查列表中的每个元素是否满足特定条件,在我的例子中它检查组件是否为 NA。
在第一种情况下,它理所当然地 returns 错误,因为只有第三个组件是 NA。
但在第二种情况下,没有元素等于 NA,它 returns TRUE。这可能是一个错误吗?
发生这种情况是因为 every
需要一个 谓词函数 作为第二个参数,也就是说,一个函数将 return 给定它的单个逻辑值输入。
当您将 is.na
应用于 b
、1:10
中的第一个(也是唯一一个)元素时,您会得到一个 10 FALSE
s 向量的结果,然后由 rlang::is_false
测试其是否为假。计算结果为 FALSE
,因为 10 FALSE
s 的矢量与单个 FALSE
不同,这反过来导致 every
returning TRUE
.
如果您使用谓词函数,结果如预期的那样:
every(b, compose(any, is.na))
#> [1] FALSE
奇怪的是,当 不 使用谓词函数时,当预期长度为 1 的参数时,您不会收到具有矢量参数的警告。可能值得就此提出问题。
我最近使用了 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
在我的理解中,every 检查列表中的每个元素是否满足特定条件,在我的例子中它检查组件是否为 NA。 在第一种情况下,它理所当然地 returns 错误,因为只有第三个组件是 NA。 但在第二种情况下,没有元素等于 NA,它 returns TRUE。这可能是一个错误吗?
发生这种情况是因为 every
需要一个 谓词函数 作为第二个参数,也就是说,一个函数将 return 给定它的单个逻辑值输入。
当您将 is.na
应用于 b
、1:10
中的第一个(也是唯一一个)元素时,您会得到一个 10 FALSE
s 向量的结果,然后由 rlang::is_false
测试其是否为假。计算结果为 FALSE
,因为 10 FALSE
s 的矢量与单个 FALSE
不同,这反过来导致 every
returning TRUE
.
如果您使用谓词函数,结果如预期的那样:
every(b, compose(any, is.na))
#> [1] FALSE
奇怪的是,当 不 使用谓词函数时,当预期长度为 1 的参数时,您不会收到具有矢量参数的警告。可能值得就此提出问题。