困惑…()?

在另一个问题中 , 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 

这是一个为什么...()原样工作的草图。 稍后我会填写更多的细节和参考资料,但是这涉及到关键点。

  1. 在对其任何组件执行replace之前, substitute()首先parsingR语句。

  2. ...()parsing为一个调用对象,而...parsing为一个名称对象。

  3. ...是一个特殊的对象,仅用于函数调用。 因此,实现replace的C代码需要采取特殊措施来处理在调用对象中find的代码。 当...作为符号出现时, 采取类似的预防措施。 (相关的代码在R_SRCDIR/src/main/coerce.c中的函数do_substitutesubstitutesubstituteList (特别是后两个)中)。

因此, () 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))(...))