43

另一个问题中,sapply(substitute(...()), as.character)在函数内部使用来获取传递给函数的名称。这as.character部分听起来不错,但到底有什么作用...()呢?

它不是以下的有效代码substitute

> test <- function(...) ...()
> test(T,F)
Error in test(T, F) : could not find function "..."

更多测试用例:

> test <- function(...) substitute(...())
> test(T,F)
[[1]]
T

[[2]]
F

> test <- function(...) substitute(...)
> test(T,F)
T
4

1 回答 1

26

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

  1. 在对其任何组件执行替换之前,substitute()首先解析 R 语句。

  2. ...()解析为调用对象,而...解析为名称对象。

  3. ...是一个特殊对象,仅用于函数调用。因此,实现替换的 C 代码...在调用对象中找到它时会采取特殊措施进行处理。当作为符号出现时,采取类似的预防措施。...(相关代码在函数do_substitute、、substitutesubstituteList(尤其是后两个)中R_SRCDIR/src/main/coerce.c。)

因此,()in的作用...()是使语句被解析为调用(又名语言)对象,以便替换将返回点的完全扩展值。即使...().列表和后续的。


附带说明:为了检查substitute各种对象的行为或类,我发现设置一个小沙箱很有用,如下所示:

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))(...))
于 2012-09-22T16:05:35.363 回答