Le langage R a une fonctionnalité astucieuse pour définir des fonctions qui peuvent prendre un nombre variable d'arguments. Par exemple, la fonction data.frame
prend n'importe quel nombre d'arguments et chaque argument devient les données d'une colonne dans la table de données résultante. Exemple d'utilisation:
> 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
La signature de la fonction comprend des points de suspension, comme ceci:
function (..., row.names = NULL, check.rows = FALSE, check.names = TRUE,
stringsAsFactors = default.stringsAsFactors())
{
[FUNCTION DEFINITION HERE]
}
Je voudrais écrire une fonction qui fait quelque chose de similaire, en prenant plusieurs valeurs et en les consolidant en une seule valeur de retour (ainsi qu'en effectuant un autre traitement). Pour ce faire, j'ai besoin de comprendre comment "décompresser" les ...
arguments de la fonction dans la fonction. Je ne sais pas comment faire ça. La ligne pertinente dans la définition de fonction dedata.frame
est object <- as.list(substitute(list(...)))[-1L]
, dont je ne peux pas comprendre.
Alors, comment puis-je convertir les points de suspension de la signature de la fonction en, par exemple, une liste?
Pour être plus précis, comment puis-je écrire get_list_from_ellipsis
dans le code ci-dessous?
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)
Éditer
Il semble qu'il existe deux façons possibles de procéder. Ils sont as.list(substitute(list(...)))[-1L]
et list(...)
. Cependant, ces deux ne font pas exactement la même chose. (Pour les différences, voir des exemples dans les réponses.) Quelqu'un peut-il me dire quelle est la différence pratique entre eux et laquelle je devrais utiliser?
list
etc
fonctionnent de cette manière, mais les deux sont des primitives, donc je ne peux pas facilement inspecter leur code source pour comprendre comment elles fonctionnent.