В языке R есть отличная функция для определения функций, которые могут принимать переменное количество аргументов. Например, функция data.frame
принимает любое количество аргументов, и каждый аргумент становится данными для столбца в результирующей таблице данных. Пример использования:
> data.frame(letters=c("a", "b", "c"), numbers=c(1,2,3), notes=c("do", "re", "mi"))
letters numbers notes
1 a 1 do
2 b 2 re
3 c 3 mi
Подпись функции включает в себя многоточие, например:
function (..., row.names = NULL, check.rows = FALSE, check.names = TRUE,
stringsAsFactors = default.stringsAsFactors())
{
[FUNCTION DEFINITION HERE]
}
Я хотел бы написать функцию, которая делает что-то подобное, беря несколько значений и объединяя их в одно возвращаемое значение (а также выполняя некоторую другую обработку). Для этого мне нужно выяснить, как "распаковать" ...
из аргументов функции внутри функции. Я не знаю, как это сделать. Соответствующей строкой в определении функции data.frame
является object <- as.list(substitute(list(...)))[-1L]
, о которой я не могу понять.
Итак, как я могу преобразовать многоточие из сигнатуры функции в, например, список?
Чтобы быть более конкретным, как написать get_list_from_ellipsis
в коде ниже?
my_ellipsis_function(...) {
input_list <- get_list_from_ellipsis(...)
output_list <- lapply(X=input_list, FUN=do_something_interesting)
return(output_list)
}
my_ellipsis_function(a=1:10,b=11:20,c=21:30)
Изменить
Кажется, есть два возможных способа сделать это. Они as.list(substitute(list(...)))[-1L]
и list(...)
. Однако эти два не делают то же самое. (Для различий см. Примеры в ответах.) Может ли кто-нибудь сказать мне, что такое практическое различие между ними, и какой из них я должен использовать?