困惑…()?
在另一个问题中 , sapply(substitute(...()), as.character)被用在一个函数内部以获得传递给函数的名字。  as.character部分听起来不错,但是究竟是什么...()呢? 
 这不是substitute之外的有效代码: 
 > test <- function(...) ...() > test(T,F) Error in test(T, F) : could not find function "..." 
一些更多的testing用例:
 > test <- function(...) substitute(...()) > test(T,F) [[1]] T [[2]] F > test <- function(...) substitute(...) > test(T,F) T 
	
 这是一个为什么...()原样工作的草图。 稍后我会填写更多的细节和参考资料,但是这涉及到关键点。 
- 
在对其任何组件执行replace之前, substitute()首先parsingR语句。
- 
...()parsing为一个调用对象,而...parsing为一个名称对象。
- 
...是一个特殊的对象,仅用于函数调用。 因此,实现replace的C代码需要采取特殊措施来处理在调用对象中find的代码。 当...作为符号出现时, 不采取类似的预防措施。 (相关的代码在R_SRCDIR/src/main/coerce.c中的函数do_substitute,substitute和substituteList(特别是后两个)中)。
 因此, () in ...()是将语句parsing为一个调用(aka语言)对象,以便replace将返回点的完全扩展值。 看起来令人惊讶的是即使它在()的外部也被replace,但是:(a)调用在内部存储为列表类对象,(b)相关的C代码似乎没有区分该列表的第一个元素和随后的元素。 
 只是旁注:为了检查substitute行为或各种对象的类别,我发现build立一个小沙箱是很有用的,就像这样: 
 f <- function(...) browser() f(a = 4, 77, B = "char") ## Then play around within the browser class(quote(...)) ## quote() parses without substituting class(quote(...())) substitute({...}) substitute(...(..., X, ...)) substitute(2 <- (makes * list(no - sense))(...))