如何检测rlang中的空状态?

时间:2017-05-25 16:57:29

标签: r tidyverse rlang

f <- function(x) enquo(x)

e <- f()
#<quosure: empty>
#~

这些都不起作用:

> is_empty(e)
[1] FALSE
> is_missing(e)
[1] FALSE
> is_false(e)
[1] FALSE
> is_quosure(e)
[1] TRUE

2 个答案:

答案 0 :(得分:9)

您可以使用quo_is_missing(x)is_missing(quo_get_expr(x))的别名。

答案 1 :(得分:3)

检查类quosure的打印方法表明它得到了#34;空的&#34;属性如此:

rlang:::env_type(get_env(e))
# [1] "empty"

不幸的是,env_type未导出,函数env_type调用也没有(最终前往C函数rlang_is_reference

您可以更直接地将其TRUE / FALSE)视为:

rlang:::is_reference(get_env(e), empty_env())
# [1] TRUE

quosure的打印方法:

rlang:::print.quosure
# function (x, ...) 
# {
#     cat(paste0("<quosure: ", env_type(get_env(x)), ">\n"))
#     print(set_attrs(x, NULL))
#     invisible(x)
# }

我对rlang不够熟悉,无法确定,但这似乎是一种使用导出函数获取所需内容的方法:

identical(get_env(e), empty_env())
# [1] TRUE

虽然我必须遗漏某些内容,因为rlang:::is_reference未使用identical