используя замену, чтобы получить имя аргумента с - PullRequest
31 голосов
/ 22 апреля 2011

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

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]]

Ответы [ 2 ]

62 голосов
/ 22 апреля 2011

Каноническая идиома здесь - 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"
23 голосов
/ 22 апреля 2011

Я бы пошел с

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)
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...