and*_*ewH 1 callstack r parameter-passing
这就是我一直认为省略号在嵌套函数中工作的方式:当你通过省略号将一组参数传递给一个函数时,调用堆栈上它的任何辅助函数都可以得到那些参数 - 我想,通过它自己的省略号.我相信参数传递给省略号累积,因此最里面的省略号包含在调用堆栈中优于它的任何函数中通过省略号参数传递的所有参数.
但我刚做了一个实验来证实这一点,现在看来我错了.从而:
> f02 <- function(...){
+ vv <- list(...)
+ print(vv)
+ }
> f01 <- function(...){
+ f02(b = 2)
+ }
> f01(a=1)
$`b`
[1] 2
Run Code Online (Sandbox Code Playgroud)
这里的内部省略号似乎没有a=1从外部省略号继承参数.
所以我目前的理论是,当你把它请求的内容的动作…,如list(…),match.call(expand.dots=TRUE)或者as.list(substitute(list(...)))[-1],你只能得到的第一个实例…中遇到的是,基于在正常的范围规则搜索路径上.但我不得不说,这对我来说似乎不太可能.如果确实如此,那么,例如,如果其中一个中间函数具有…参数,则提供给绘图函数的几个调用的图形参数将遭受神秘的失败.
所以我想知道是否有一些特殊的规则来确定点点阵中寻找的范围,比如寻找一个优越的实例,如果本地一个是空的,或者如果你寻找…一个特定的命名参数,比如说list(...)$my_parameter,做找不到它.这些解决方案都没有让我觉得非常合理,但是,我没有想到的那些解决方案.
以前关于这个主题的问题似乎主要集中在各种边缘案例上.我正在寻找更多理解正常情况下的传递规则(但可能有多层调用).
必须明确提供省略号以传递给嵌套函数,因此,例如,在您的f02中,list调用将传递给f02的任何内容作为其自己的参数.相反,在f01中,参数被简单地忽略.你可以在f01中将参数传递给f02:
f01 <- function(...){
f02(b = 2,...)
}
Run Code Online (Sandbox Code Playgroud)
结果:
f01(a=1)
$b
[1] 2
$a
[1] 1
Run Code Online (Sandbox Code Playgroud)
无论省略号中的参数数量如何,这都有效:
f01(a=1,c=3)
$b
[1] 2
$a
[1] 1
$c
[1] 3
Run Code Online (Sandbox Code Playgroud)