困惑…()?
在另一个问题中 , 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))(...))