为什么 rlang::quo_is_missing(quo(NA)) 评估为 FALSE?

Why does rlang::quo_is_missing(quo(NA)) evaluate to FALSE?

如果我理解,rlang::quo_is_missing 计算一个 quosure 并检查它是否包含缺失值。如果是,则应 return TRUE,否则应为 FALSE。然而,我尝试了以下组合,但它总是 returns FALSE:

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

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

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

为什么当值明显缺失时 return 为 FALSE?

“缺失”是一个特殊术语,指的是根本不存在的值。 NA 与“缺失”不同——NA 本身就是一个值。在 base R 中,您可以比较函数 is.na()missing(),每个函数做不同的事情。 quo_is_missing 就像 missing() 函数,而不是 is.na 和 returns 仅当根本没有值时才为真:

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