Подтвердить что ты не робот

Используя substitute для получения имени аргумента с помощью

Я пытаюсь получить имена аргументов в глобальной среде внутри функции. Я знаю, что я могу использовать substitute для получения имени именованных аргументов, но я хотел бы иметь возможность делать то же самое с аргументами. Я как-то получил его для работы над первым элементом... но не могу понять, как это сделать для остальных элементов. Любая идея, как заставить это работать по назначению.

foo <- function(a,...)
{
    print(substitute(a))
    print(eval(enquote(substitute(...))))
    print(sapply(list(...),function(x) eval(enquote(substitute(x)),env=.GlobalEnv)))
}

x <- 1
y <- 2
z <- 3
foo(x,y,z)

x
y
[[1]]
X[[1L]]

[[2]]
X[[2L]]
4b9b3361

Ответ 1

Каноническая идиома здесь deparse(substitute(foo)), но ... нуждается в немного другой обработке. Вот модификация, которая делает то, что вы хотите:

foo <- function(a, ...) {
    arg <- deparse(substitute(a))
    dots <- substitute(list(...))[-1]
    c(arg, sapply(dots, deparse))
}

x <- 1
y <- 2
z <- 3

> foo(x,y,z)
[1] "x" "y" "z"

Ответ 2

Я бы пошел с

foo <- function(a, ...) {
print( n <- sapply(as.list(substitute(list(...)))[-1L], deparse) )
    n
}

Тогда

foo(x,y,z)
# [1] "y" "z"

Ранее обсуждался вопрос о StackOverflow: Как использовать функцию эллипсиса R при написании собственной функции? Стоит прочитать.


Второе решение, используя match.call

foo <- function(a, ...) {
    sapply(match.call(expand.dots=TRUE)[-1], deparse)
}