Il linguaggio R ha una caratteristica elegante per la definizione di funzioni che possono accettare un numero variabile di argomenti. Ad esempio, la funzione data.frame
accetta un numero qualsiasi di argomenti e ogni argomento diventa i dati per una colonna nella tabella di dati risultante. Esempio di utilizzo:
> 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 firma della funzione include un puntino di sospensione, come questo:
function (..., row.names = NULL, check.rows = FALSE, check.names = TRUE,
stringsAsFactors = default.stringsAsFactors())
{
[FUNCTION DEFINITION HERE]
}
Vorrei scrivere una funzione che fa qualcosa di simile, prendendo più valori e consolidandoli in un singolo valore di ritorno (oltre a fare qualche altra elaborazione). Per fare questo, ho bisogno di capire come "decomprimere" gli ...
argomenti della funzione all'interno della funzione. Non so come farlo. La linea rilevante nella definizione della funzione di data.frame
è object <- as.list(substitute(list(...)))[-1L]
, che non riesco a capire.
Quindi, come posso convertire i puntini di sospensione dalla firma della funzione in, ad esempio, un elenco?
Per essere più specifici, come posso scrivere get_list_from_ellipsis
nel codice qui sotto?
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)
modificare
Sembra che ci siano due modi possibili per farlo. Sono as.list(substitute(list(...)))[-1L]
e list(...)
. Tuttavia, questi due non fanno esattamente la stessa cosa. (Per le differenze, vedi esempi nelle risposte.) Qualcuno può dirmi qual è la differenza pratica tra loro e quale dovrei usare?
list
ec
funzionano in questo modo, ma entrambe sono primitive, quindi non riesco a ispezionare facilmente il loro codice sorgente per capire come funzionano.