El lenguaje R tiene una característica ingeniosa para definir funciones que pueden tomar un número variable de argumentos. Por ejemplo, la función data.frame
toma cualquier número de argumentos, y cada argumento se convierte en los datos para una columna en la tabla de datos resultante. Ejemplo 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
La firma de la función incluye puntos suspensivos, como este:
function (..., row.names = NULL, check.rows = FALSE, check.names = TRUE,
stringsAsFactors = default.stringsAsFactors())
{
[FUNCTION DEFINITION HERE]
}
Me gustaría escribir una función que haga algo similar, tomar múltiples valores y consolidarlos en un solo valor de retorno (además de realizar algún otro procesamiento). Para hacer esto, necesito descubrir cómo "desempaquetar" los ...
argumentos de la función dentro de la función. No se como hacer esto. La línea relevante en la definición de la función de data.frame
es object <- as.list(substitute(list(...)))[-1L]
, que no puedo entender.
Entonces, ¿cómo puedo convertir los puntos suspensivos de la firma de la función en, por ejemplo, una lista?
Para ser más específico, ¿cómo puedo escribir get_list_from_ellipsis
en el código a continuación?
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 hay dos formas posibles de hacer esto. Son as.list(substitute(list(...)))[-1L]
y list(...)
. Sin embargo, estos dos no hacen exactamente lo mismo. (Para ver las diferencias, vea ejemplos en las respuestas). ¿Alguien puede decirme cuál es la diferencia práctica entre ellos y cuál debo usar?
list
yc
funcionan de esta manera, pero ambas son primitivas, por lo que no puedo inspeccionar fácilmente su código fuente para comprender cómo funcionan.