Мова 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(...)
. Однак ці двоє не роблять абсолютно одного і того ж. (Про відмінності див. Приклади у відповідях.) Чи може хто-небудь сказати мені, у чому полягає практична різниця між ними, і яку я повинен використовувати?
list
іc
функції, і функції працюють таким чином, але обидві - примітиви, тому я не можу легко перевірити їх вихідний код, щоб зрозуміти, як вони працюють.