Как проверить, является ли аргумент функции «квазиразличным» именем? - PullRequest
1 голос
/ 21 марта 2020

Я делаю функцию, которая должна иметь возможность обрабатывать несколько классов для своего первого аргумента: формулы, символы, 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 случае.

Есть ли встроенная функция для тестирования это или более чистое решение, чем этот обходной путь?

1 Ответ

0 голосов
/ 21 марта 2020

Я думаю, что вы пытаетесь сделать следующее (используя здесь только базу R).

foo=function(.vars) {
  .vars2 = substitute(.vars)
  ifelse(is.symbol(.vars2), class(.vars2), class(.vars))
  }

foo(Species) 
#[1] "name"
foo(~Species)
#[1] "formula"
foo(1)
#[1] "numeric"
foo("Species")
#[1] "character"
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...