In 另一个问题 https://stackoverflow.com/a/12417320/636656, sapply(substitute(...()), as.character)
在函数内部使用来获取传递给函数的名称。这as.character
部分听起来不错,但到底是做什么的...()
do?
该代码在以下范围之外无效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
这是原因的草图...()
就这样工作。稍后我将补充更多细节和参考资料,但这涉及到要点。
在对其任何组件进行替换之前,substitute()
首先解析 R 语句。
...()
解析为调用对象,而...
解析为名称对象。
...
是一个特殊对象,仅用于函数调用。因此,实现替换的 C 代码会采取特殊措施来处理...
当在调用对象中找到它时。类似的预防措施还有not拍摄时间...
作为一个符号出现。 (相关代码在函数中do_substitute
, substitute
, and substituteList
(尤其是后两者)R_SRCDIR/src/main/coerce.c
.)
所以,()
in ...()
是使语句被解析为调用(也称为语言)对象,以便替换将返回点的完全展开的值。看起来可能令人惊讶的是...
即使它位于外部,也会被替换()
,但是:(a) 调用在内部存储为类似列表的对象,并且 (b) 相关的 C 代码似乎没有区分该列表的第一个元素和后续元素。
只是旁注:用于检查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))(...))
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)