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