Język R ma ciekawą funkcję do definiowania funkcji, które mogą przyjmować zmienną liczbę argumentów. Na przykład funkcja data.frame
przyjmuje 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.frame
jest 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_ellipsis
w 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ć?
list
ic
dział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ą.