使用substitute来获取参数名称

时间:2011-04-22 10:06:46

标签: r

我试图在函数中获取全局环境中的参数名称。我知道我可以使用替换来获取命名参数的名称,但我希望能够用...参数做同样的事情。我有点让它为...的第一个元素工作,但无法弄清楚如何为其余的元素做这件事。任何想法如何使其按预期工作。

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 个答案:

答案 0 :(得分:60)

这里的规范习语是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"

答案 1 :(得分:22)

我会选择

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

然后

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

以前在StackOverflow上有相关问题: How to use R's ellipsis feature when writing your own function?值得一读。


第二个解决方案,使用match.call

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