Конструкция do.call(function(...) Map(list, ...), cars) в языке R - порядок обхода аргументов

Не будут ли уважаемые коллеги настолько любезны, чтоб пояснять, каков принцип обхода аргументов в конструкции do.call(function(...) Map(list, ...), cars) ? Почему в отличии от прямой конструкции Map(list, cars) результат будет отличаться порядком (грубо говоря произойдет "транспонирование" матрицы). (Речь о языке - "R").

cars <- list(list("white BMW", "black BMW","1_3"), list("white GMC", "black GMC","2_3"), list("3 white GMC", "3 black GMC","3 2_3") )

do.call(function(...) Map(list, ...), cars)

Выдаст ответ:

'white BMW' 'white GMC' '3 white GMC'

'black BMW' 'black GMC' '3 black GMC'

'1_3' '2_3' '3 2_3'

В отличии от Map(list, cars)

'white BMW' 'black BMW' '1_3'

'white GMC' 'black GMC' '2_3'

'3 white GMC' '3 black GMC' '3 2_3'

Пример ноутбука с кодами :

https://www.kaggle.com/alexandervc/r-do-call-map-with-3-dots


Ответы (1 шт):

Автор решения: Ogurtsov

Внутри do.call() происходит вычисление выражения Map(list, list("white BMW", "black BMW","1_3"), list("white GMC", "black GMC","2_3"), list("3 white GMC", "3 black GMC","3 2_3")).

Дело в том, что

args    a list of arguments to the function call. The names attribute of args gives the argument names.

И вместо ... подставляется не один объект cars (список списков), а все вложенные списки по отдельности.

→ Ссылка