R: Как вернуть точную форму `...` в `fn (...)` без вычисления `...`? - PullRequest
2 голосов
/ 02 мая 2020

Рассмотрим этот код

fn = function(...) {
  # print the content of ... without evaluation?
}

Я хочу, чтобы выходные данные fn(a = b) были "a = b", а fn(a = gn(b), 3~b~a, dd, e = 2 + f, h = hn(jn(cdf))) были list("a=gn(b)", "3~b~a", "dd", "e=2+f", "h= hn(jn(cdf)))".

Я не могу найти правильную функцию NSE для него. Я предпочитаю Base R, поэтому я понимаю процесс лучше. Самый близкий, который я получил, был этим

fn = function(...) {
   res = rlang::enexprs(...)
   paste0(names(res), ifelse(names(res)=="",names(res) , "=") , sapply(res, capture.output))
}

Ответы [ 2 ]

4 голосов
/ 02 мая 2020

Альтернативой match.call ( см. Здесь ) является недокументированное ...().

fn <- function(...) {
  x <- substitute(...())
  y <- ifelse(nchar(names(x)) > 0, paste(names(x), "=", x), as.character(x))
  as.list(y)
}

fn(a = b)
fn(a = gn(b), 3~b~a, dd, e = 2 + f, h = hn(jn(cdf)))
3 голосов
/ 02 мая 2020

Вы можете использовать match.call:

fn = function(...) {
  temp <- as.list(match.call())[-1]
  as.list(sub('^=', '', paste0(names(temp), '=', temp)))
}

fn(a = b)
#[[1]]
#[1] "a=b"

fn(a = gn(b), 3~b~a, dd, e = 2 + f, h = hn(jn(cdf)))
#[[1]]
#[1] "a=gn(b)"

#[[2]]
#[1] "3 ~ b ~ a"

#[[3]]
#[1] "dd"

#[[4]]
#[1] "e=2 + f"

#[[5]]
#[1] "h=hn(jn(cdf))"
...