Разобрать, заменить аргументами из трех точек - PullRequest
2 голосов
/ 06 марта 2019

Давайте рассмотрим типичный 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, чтобы найти себя с практическими рекомендациями за приемлемое количество времени.

1 Ответ

4 голосов
/ 06 марта 2019

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

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

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

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

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

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

...