我正在制作一个函数,该函数应该能够为其第一个参数处理多个类:公式,字符,整洁选择,变量名...然后目标是将整洁选择与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"
这对我来说似乎并不干净,因为我捕获了所有错误而没有根据我的具体情况进行过滤。
是否有内置功能对此功能进行测试,或者比此替代方法更干净的解决方案?
我不使用rlang
,所以我不清楚您想要什么还是为什么。但是,我认为以下是您要尝试做的事情(仅在此处使用基数R)。如果我不能正确理解您想要的结果,请告诉我,我将删除此答案。