Я делаю функцию, которая должна иметь возможность обрабатывать несколько классов для своего первого аргумента: формулы, символы, tidy-selection, var names ... Цель состоит в том, чтобы затем использовать 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"
Это не кажется мне чистым, так как я ловлю все ошибки без фильтрации в моем конкретном c случае.
Есть ли встроенная функция для тестирования это или более чистое решение, чем этот обходной путь?