Депарс, заменить аргументами из трех точек

Рассмотрим типичный вызов deparse(substitute( R:

f1 <-function(u,x,y)
{print(deparse(substitute(x)))}

varU='vu'
varX='vx'
varY='vy'
f1(u=varU,x=varX,y=varY)

Это приводит к

[1] "varX"

чего мы ожидаем и хотим.

Затем возникает проблема, я пытаюсь добиться аналогичного поведения, используя аргументы ..., т.е.

f2 <- function(...)
{  l <- list(...)
  x=l$x
  print(deparse(substitute(x))) ### this cannot work but I would like something like that
}

Неудивительно, что это не работает:

f2(u=varU,x=varX,y=varY)
[1] "\"vx\"" ### wrong ! I would like "varX"

Я попытался получить ожидаемое поведение, используя другую комбинацию решений, но ни одно из них не дает мне того, что ожидалось, и кажется, что я все еще недостаточно разбираюсь в ленивом eval, чтобы найти себе практические рекомендации в разумное количество времени.


person user1835313    schedule 06.03.2019    source источник
comment
ты ищешь f2 <- function(...) as.character(as.list(match.call())$x)?   -  person chinsoon12    schedule 06.03.2019
comment
@ chinsoon12 Спасибо, это работает!   -  person user1835313    schedule 06.03.2019


Ответы (1)


Вы можете получить список всех неоцененных аргументов, выполнив

match.call(expand.dots = FALSE)$...

Или, если у вас только есть аргументы с точками, через

as.list(match.call()[-1L])

Это даст вам именованный список, аналогичный list(...), но в его неоцененной форме (аналогично тому, что substitute делает с одним аргументом).

Альтернативой является использование rlang::quos(...), если вы хотите использовать пакет {rlang}, который возвращает аналогичный результат в несколько иной форме.

person Konrad Rudolph    schedule 06.03.2019