Вот как я думал, что многоточие работает во вложенных функциях: когда вы передаете набор аргументов функции через многоточие, любая вспомогательная функция в стеке вызовов может получить эти аргументы - я думал, черезсвой многоточиеЯ полагал, что аргументы, передаваемые многоточию, накапливаются, так что внутренний многоточие содержит все аргументы, переданные через аргументы многоточия в любой из функций, превосходящих его в стеке вызовов.
Но я только что провел эксперимент, чтобы подтвердить это, и теперь мне кажется, что это неправильно.Таким образом:
> 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
, и не находитеэто там .Ни одно из этих решений не кажется мне очень правдоподобным, но, в общем-то, ни одно из предложенных мною решений не подходит.
Предыдущие вопросы по этой теме, похоже, были сосредоточены главным образом на различных крайних случаях.Я ищу больше для понимания правил прохождения в обычном случае (но, возможно, с несколькими уровнями вызовов).