使用替代函数获取参数名称

33

我正在尝试在一个函数内获取全局环境中参数的名称。我知道可以使用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]]
2个回答

64

这里的惯用语是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

我会选择

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)
}

很好的使用了match.call()函数 - 我之前不知道还有expand.dots参数。 - Gavin Simpson
1
虽然有些晚了,但是names(sapply(match.call(), deparse))[-1]对于我的需求非常好用,可以获得一个参数名称的字符向量([-1]会去除函数本身的名称)。 - sckott

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接