Допустим, я хочу функцию, которая печатает все выражения, которые ей даны:

> foo(abc(def),gh[i],j)
abc(def)
gh[i]
j

Я хочу знать, есть ли хороший способ сделать это. Я разработал, как сделать это с помощью рекурсии:

foo <- function(x, ...) {
    if (!is.missing(x)) {
        print(substitute(x))
        foo(...)
    }
}

Но я чувствую, что должен быть лучший способ, используя цикл или, возможно, какой-то способ использования list () и lapply () или что-то в этом роде.

1
Anonymous 28 Апр 2020 в 18:04

2 ответа

Вы можете использовать специальный ...() синтаксис

foo <- function(...) {
  exprs <- substitute(...())
  print(exprs)
}
foo(abc(def), gh[i], j)

Здесь exprs будет список, который вы можете перебирать по своему усмотрению.

1
MrFlick 28 Апр 2020 в 15:07

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

foo <- function(...) {
    for (expr in as.list(sys.call()[-1])) {
        print(expr)
    }
}

Альтернативный способ сделать то же самое:

as.list(substitute({...})[-1])

Другая альтернатива, без необходимости [-1]:

eval(substitute(expression(...)))
1
Anonymous 1 Май 2020 в 13:36