Передача пропущенных квази-цитатных аргументов
Я пытаюсь использовать квазиквотацию для передачи необработанного имени переменной в функцию, которая передает его другой функции. Тем не менее, аргумент является необязательным, поэтому мне нужно проверить, была ли 1-й функции задан этот аргумент и передан этот отсутствующий аргумент 2-й функции.
В этих примерах b
ссылается на переменную в data.frame.
Проверяя, была ли передана функция выражения сырой переменной или нет аргумента, я делаю
foo <- function(a) {
print(is_missing(enexpr(a)))
}
foo()
# [1] TRUE
foo(b)
# [1] FALSE
Без enexpr
переменная b
попытается быть оцененным - и при отсутствии - ошибки.
Далее я пытаюсь передать отсутствующий аргумент другой функции (bar
) кого потом проверим на наличие:
foo2 <- function(a) {
print(is_missing(enexpr(a)))
bar(maybe_missing(a))
}
bar <- function(a) {
print(is_missing(enexpr(a)))
}
foo2()
# [1] TRUE
# [1] FALSE <-- "wrong" (but not unexpected)
foo2(b)
# [1] FALSE
# [1] FALSE
Вопрос: как я могу в bar
проверить, foo2
был передан аргумент?
Запуск R 3.5.1 с Rlang 0.3.0.1.
1 ответ
Решение
Мы могли бы сделать !!
и enexpr
в foo2
foo2 <- function(a) {
print(is_missing(enexpr(a)))
bar(!!maybe_missing(enexpr(a)))
}
foo2()
#[1] TRUE
#[1] TRUE
foo2(b)
#[1] FALSE
#[1] FALSE