【发布时间】:2018-11-21 17:41:15
【问题描述】:
这就是我一直认为省略号在嵌套函数中工作的方式:当您通过省略号将一组参数传递给函数时,调用堆栈上的任何附属函数都可以获取这些参数——我想,通过它自己的省略号。我相信传递给省略号的参数是累积的,因此最里面的省略号包含调用堆栈中任何优于它的函数中通过省略号参数传递的所有参数。
但我刚刚做了一个实验来证实这一点,现在我觉得它是错误的。因此:
> f02 <- function(...){
+ vv <- list(...)
+ print(vv)
+ }
> f01 <- function(...){
+ f02(b = 2)
+ }
> f01(a=1)
$`b`
[1] 2
这里的内部省略号似乎没有从外部省略号继承a=1 参数。
所以我目前的理论是,当你执行一个请求… 内容的操作时,例如list(…)、match.call(expand.dots=TRUE) 或as.list(substitute(list(...)))[-1],你只会得到… 的第一个实例遇到,基于正常范围规则下的搜索路径。但我不得不说,这对我来说似乎不太可能。如果这是真的,那么,例如,如果其中一个中间函数有 … 参数,则提供给绘图函数的图形参数多次调用将遭受神秘的失败。
所以我想知道是否有一些特殊规则用于在点-点-点中寻求范围参数,例如如果本地实例为空,则查找上级实例,或者如果您在 … 中查找特定名称论据,说list(...)$my_parameter,但在那里找不到。这些解决方案都没有让我觉得很合理,但是,我想出的解决方案都没有。
以前有关此主题的问题似乎主要集中在各种边缘情况上。我正在寻找更多以了解正常情况下的传递规则(但可能需要多层调用)。
【问题讨论】:
标签: r parameter-passing callstack