Используя 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]]
Ответы
Ответ 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)
}