Język R ma ciekawą funkcję do definiowania funkcji, które mogą przyjmować zmienną liczbę argumentów. Na przykład funkcja data.frameprzyjmuje dowolną liczbę argumentów, a każdy argument staje się danymi dla kolumny w wynikowej tabeli danych. Przykładowe użycie:
> 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
Podpis funkcji zawiera wielokropek, taki jak ten:
function (..., row.names = NULL, check.rows = FALSE, check.names = TRUE,
stringsAsFactors = default.stringsAsFactors())
{
[FUNCTION DEFINITION HERE]
}
Chciałbym napisać funkcję, która robi coś podobnego, biorąc wiele wartości i konsolidując je w jedną wartość zwracaną (a także wykonując inne przetwarzanie). Aby to zrobić, muszę dowiedzieć się, jak „rozpakować” ...argumenty funkcji w funkcji. Nie wiem jak to zrobić. Odpowiednią linią w definicji funkcji data.framejest object <- as.list(substitute(list(...)))[-1L], której nie rozumiem.
Jak mogę przekonwertować wielokropek z podpisu funkcji na, na przykład, listę?
Mówiąc ściślej, jak mogę napisać get_list_from_ellipsisw poniższym kodzie?
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)
Edytować
Wydaje się, że istnieją dwa możliwe sposoby, aby to zrobić. Oni są as.list(substitute(list(...)))[-1L]i list(...). Jednak ci dwaj nie robią dokładnie tego samego. (Aby zapoznać się z różnicami, zobacz przykłady w odpowiedziach.) Czy ktoś może mi powiedzieć, jaka jest praktyczna różnica między nimi, a której powinienem użyć?
listicdziałają w ten sposób, ale obie są prymitywami, więc nie mogę łatwo sprawdzić ich kodu źródłowego, aby zrozumieć, jak działają.