Я писал функцию, которая использует многоточие (также известное как ...
). Он позволяет вам указать переменное количество дополнительных аргументов. Я хотел предоставить список с аргументами в качестве дополнительного аргумента. Ниже приведен воспроизводимый пример:
f <- function(..., a =1, b = 2){
l <- list(...)
print(l)
}
f(list(a = 2))
[[1]]
[[1]]$a
[1] 2
Целью предоставления дополнительных аргументов в списке было избежать конфликта имен (функция внутри f
могла принимать аргумент с именем a
, и я хотел обеспечить возможность его предоставления).
При изменении реализации я заметил, что перемещение многоточия на последнее место в объявлении функции возвращает другой результат (а именно пустой список):
g <- function(a =1, b = 2, ...){
l <- list(...)
print(l)
}
g(list(a = 2))
list()
Из любопытства я добавил к обеим функциям печать аргументов по умолчанию:
f <- function(..., a =1, b = 2){
l <- list(...)
print(l)
print(c(a = a, b = b))
}
g <- function(a =1, b = 2, ...){
l <- list(...)
print(l)
print(c(a = a, b = b))
}
f(list(a = 2)) # results of calling f
[[1]]
[[1]]$a
[1] 2
a b
1 2
g(list(a = 2)) # results of calling g
list()
$a.a
[1] 2
$b
[1] 2
Итак, первая функция (f
) вернула предполагаемый результат, но вторая (g
) проигнорировала (?) Аргумент по умолчанию a
и каким-то образом изменила список, предоставленный благодаря многоточию.
Хотелось бы понять, почему оба выхода отличаются друг от друга. Означает ли это, что передача списка в качестве дополнительного аргумента возможна только в том случае, если многоточие является первым аргументом в вызове функции?