Передача отсутствующих аргументов квазиквотации

#r #rlang #quasiquotes

#r #rlang #квазиквоты

Вопрос:

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

Комментарии:

1. Блестяще! Спасибо akrun. Все еще пытаюсь понять квазиквотацию. Придется перечитать главы в расширенном R. Хэдли..