Я делаю функцию, которая должна иметь возможность обрабатывать несколько классов для своего первого аргумента: формулы, символы, аккуратный выбор, имена переменных... Затем цель состоит в том, чтобы использовать аккуратный выбор с 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
. Сокращенные версии, которые у вас были изначально, немного вводили в заблуждение. Если то, что я вставил сейчас, не соответствует полученному результату, отредактируйте еще раз. - person dww   schedule 21.03.2020