【发布时间】:2020-07-02 10:13:09
【问题描述】:
我正在创建一个函数,它应该能够为其第一个参数处理多个类:公式、字符、tidy-selection、var 名称......然后目标是使用 tidyselection 和 tidyselect::vars_select,除了裸公式。
问题是,当我测试这个参数的类时,如果值是一个需要整齐选择的名称,它会抛出一个错误,因为它会被认为是一个未找到的对象。
我找到了tryCatch 的解决方法,如果它的评估失败(因此如果它不存在于这个范围内),它会引用第一个参数。
library(rlang)
foo=function(.vars){
.vars2=tryCatch(.vars, error=function(e) enquo(.vars))
print(class(.vars2))
print(class(.vars))
}
foo(Species)
# [1] "quosure" "formula"
# Error in print(class(.vars)) : object 'Species' not found
# In addition: Warning message:
# In print(class(.vars)) : restarting interrupted promise evaluation
foo(~Species)
# [1] "formula"
# [1] "formula"
foo(1)
# [1] "numeric"
# [1] "numeric"
foo("Species")
# [1] "character"
# [1] "character"
这对我来说似乎并不干净,因为我没有过滤我的具体情况就发现了所有错误。
是否有一个内置函数来测试这个,或者比这个解决方法更干净的解决方案?
【问题讨论】:
-
添加了
foo的完整输出。您最初的删节版本有点误导。如果我现在输入的内容与您得到的输出不匹配,请再次编辑。 -
@dww 我的错,你的编辑完全正确。