2011-04-22 41 views
31

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

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

回答

54

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

不错的清洁解决方案,谢谢 – darckeen 2011-04-22 11:06:46

22

我会

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

然后

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

相关问题去之前在计算器上: 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) 
} 
+0

感谢您的链接 – darckeen 2011-04-22 11:06:11

+0

尼斯使用match.call的'()' - 我不知道'expand.dots'说法。 – 2011-04-24 11:25:29

+1

对于晚会来说,但名称(sapply(match.call(),deparse))[ - 1]'用于获取参数名称的字符向量的用例([-1])将自身的函数名称删除) – sckott 2013-11-12 16:23:14