2014-10-26 23 views
1

這是我想做什麼:如何申請報價的每一個參數的函數

as.character(quote(x)) 
[1] "x" 

現在我想將它放在一個函數。

qq <- function(a) as.character(substitute(a)) 
qq(x) 
[1] "x" 

好。但是:

qq <- function(...) as.character(substitute(...)) 
qq(x,y,z) 
[1] "x" 

OK,怎麼樣:

qq <- function(...) sapply(..., function (x) as.character(substitute(x))) 
qq(x,y,z) 
Error in get(as.character(FUN), mode = "function", envir = envir) : 
object 'y' of mode 'function' was not found 

和:

qq <- function(...) sapply(list(...), function (x) as.character(substitute(x))) 
qq(x,y,z) 
Error in lapply(X = X, FUN = FUN, ...) : object 'z' not found 

有沒有辦法做到這一點?

回答

3

試試這個:

qq <- function(...) sapply(substitute({ ... })[-1], deparse) 
qq(a, b, c) 
## [1] "a" "b" "c" 

注:qq(a)所以問題是,substitute期待一個參數,而不是幾個:qq <- function(...) as.character(substitute(...))如果傳遞了一個單一的argumet確實工作。 {...}將多個參數轉換爲一個。

+0

你能否解釋爲什麼'''substitute({...})''在沒有curlies的情況下工作,它只返回第一個參數? – dash2 2014-10-27 10:08:44

+0

請參閱添加註釋。 – 2014-10-27 11:57:09

4

你可以嘗試match.call

foo <- function(...) { 
    sapply(as.list(match.call())[-1], deparse) 
} 
foo(x, y, z) 
# [1] "x" "y" "z" 
foo(a, b, c, d, e) 
# [1] "a" "b" "c" "d" "e" 

如果有任何其他參數,您可能希望上述功能的一些變化。

foo2 <- function(x, ...) { 
    a <- as.list(match.call(expand.dots = FALSE))$... 
    sapply(a, deparse) 
} 
foo2(5, x, y, z) 
# [1] "x" "y" "z" 
+0

(+1)for'match.call'不知道它做了什麼。它只是從'...'中檢索值? – 2014-10-26 21:37:20

+0

'''deparse'''和'''as.character(替代(x))'''有什麼區別?也許這只是一個普遍的請求,讓人來解釋'deparse','''''''''','''''''''''''''''''''''''''''''' ''等等等...... – dash2 2014-10-27 10:09:24

+0

好吧,我不打算解釋所有這些,但'deparse'通常用於將未評估的表達式轉換爲字符串,這就是您在這裏所做的。我也努力去理解所有這些差異。我的大部分問題都是通過嘗試解決的。 – 2014-10-28 00:47:16