【问题标题】:Why does rlang::quo_is_missing(quo(NA)) evaluate to FALSE?为什么 rlang::quo_is_missing(quo(NA)) 评估为 FALSE?
【发布时间】:2021-10-10 21:53:02
【问题描述】:

如果我理解,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?

【问题讨论】:

  • quo_is_missing 不检查 NA,它检查包含缺失参数的 quosures。请参阅rlang.r-lib.org/reference/quosure.html 中的示例。
  • 是的,但是我作为参数提供的 quosure (quo(NA)) 包含 NA。

标签: r rlang


【解决方案1】:

“缺失”是一个特殊术语,指的是根本不存在的值。 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

【讨论】:

    猜你喜欢
    • 2015-03-15
    • 2015-03-22
    • 1970-01-01
    • 1970-01-01
    • 2014-02-16
    • 2022-01-10
    • 2012-03-06
    • 1970-01-01
    相关资源
    最近更新 更多