首页 > 解决方案 > 为什么 rlang::quo_is_missing(quo(NA)) 评估为 FALSE?

问题描述

如果我理解, rlang::quo_is_missing 会评估 quosure 并检查它是否包含缺失值。如果是,它应该返回 TRUE,否则返回 FALSE。然而,我尝试了以下组合,它总是返回 FALSE:

rlang::quo_is_missing(quo(NA))
rlang::quo_is_missing(quo(NA_character_))
rlang::quo_is_missing(quo(NA_integer_))

如果我尝试非 NA 值,它也会返回 FALSE,正如预期的那样:

rlang::quo_is_missing(quo("hello"))

当值明显丢失时,为什么它返回 FALSE?

标签: rrlang

解决方案


“缺失”是一个特殊术语,指的是根本不存在的值。NA与“缺失”不同——NA它本身就是一个值。在基础 R 中,您可以比较函数is.na(),并且missing()每个函数都做不同的事情。quo_is_missing就像missing()函数一样,不是is.na,只有在根本没有值时才返回 true:

rlang::quo_is_missing(quo())

如果你想检查 NA,你可以写一个助手

quo_is_na <- function(x) {
    !rlang::quo_is_symbolic(x) && 
      !rlang::quo_is_missing(x) && 
      !rlang::quo_is_null(x) &&
      is.na(rlang::quo_get_expr(x))
}
quo_is_na(quo())
# [1] FALSE
quo_is_na(quo(x+y))
# [1] FALSE
quo_is_na(quo(NULL))
# [1] FALSE
quo_is_na(quo(42))
# [1] FALSE

quo_is_na(quo(NA))
# [1] TRUE
quo_is_na(quo(NA_character_))
# [1] TRUE

推荐阅读