2011-04-22 33 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