В языке 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(...)
. Однако эти двое не делают одно и то же. (Различия см. В примерах в ответах.) Может ли кто-нибудь сказать мне, в чем практическая разница между ними и какую из них я должен использовать?