A linguagem R possui um recurso bacana para definir funções que podem receber um número variável de argumentos. Por exemplo, a função data.frame
aceita qualquer número de argumentos e cada argumento se torna os dados de uma coluna na tabela de dados resultante. Exemplo de uso:
> 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
A assinatura da função inclui reticências, assim:
function (..., row.names = NULL, check.rows = FALSE, check.names = TRUE,
stringsAsFactors = default.stringsAsFactors())
{
[FUNCTION DEFINITION HERE]
}
Eu gostaria de escrever uma função que faça algo semelhante, pegando vários valores e consolidando-os em um único valor de retorno (além de fazer outro processamento). Para fazer isso, preciso descobrir como "descompactar" os ...
argumentos da função dentro da função. Eu não sei como fazer isso. A linha relevante na definição de função de data.frame
é object <- as.list(substitute(list(...)))[-1L]
, da qual não consigo entender.
Então, como posso converter as reticências da assinatura da função em, por exemplo, uma lista?
Para ser mais específico, como posso escrever get_list_from_ellipsis
no código abaixo?
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)
Editar
Parece que existem duas maneiras possíveis de fazer isso. Eles são as.list(substitute(list(...)))[-1L]
e list(...)
. No entanto, esses dois não fazem exatamente a mesma coisa. (Para as diferenças, veja exemplos nas respostas.) Alguém pode me dizer qual é a diferença prática entre eles e qual devo usar?
list
ec
funcionam dessa maneira, mas ambas são primitivas, portanto não posso inspecionar facilmente o código-fonte para entender como elas funcionam.