Uso de "…" (tres puntos o punto-punto-punto) en funciones [duplicar]

Respuestas:

75

La palabra que se usa para describir ...es "puntos suspensivos". Saber esto debería facilitar la búsqueda de información sobre el constructo. Por ejemplo, el primer resultado en Google es otra pregunta en este sitio: ¿Cómo usar la función de puntos suspensivos de R al escribir su propia función?

John Zwinck
fuente
3
En realidad, el nombre oficial en R es dots, por ejemplo, se nombra la página de ayuda ?dotsy la "puntos suspensivos" ni siquiera se menciona en la página
MichaelChirico
En cuanto a los archivos de ayuda, ?dotsno me funciona, pero ?'...'sí.
Coip
54

Un pequeño ejemplo para empezar.

f <- function(x, ...)
{
  dots <- list(...)                   #1
  if(length(dots) == 0) return(NULL) 
  cat("The arguments in ... are\n")
  print(dots)
  f(...)                              #2
}

f(1,2,3,"a", list("monkey"))

La función, falmacena todo menos el primer argumento de entrada en la variable de puntos suspensivos. Para acceder a su contenido, es más fácil convertirlo en una lista (1). Sin embargo, el uso principal es pasar argumentos a subfunciones, lo que no requiere conversión (2).

Richie algodón
fuente
¿Por qué en el n. ° 2 volver a llamar a la misma función f?
Jiapeng Zhang
1
@JiapengZhang Es un ejemplo de función recursiva. f()se llama repetidamente con diferentes argumentos cada vez. Ejecute el código y vea si puede comprender lo que está sucediendo.
Richie Cotton
2
Esto sería un gran ejemplo para demostrar ...length()así
MichaelChirico
19

Debe dirigirse a "Definición del lenguaje R", sección 2.1.9 Punto-punto-punto . Viene incluido con la instalación R. Ejecute help.start()una sesión interactiva para que aparezca la ayuda HTML y haga clic en el enlace Definición del lenguaje R. También puede utilizar la versión PDF o HTML del sitio principal.

De todos modos, ...se usa para hacer coincidir argumentos formales no especificados de una función.

args(sapply)                                                                                                               
function (X, FUN, ..., simplify = TRUE, USE.NAMES = TRUE)                                                                    
NULL   

sapply(mtcars, mean, trim = .5)                                                                                            
    mpg     cyl    disp      hp    drat      wt    qsec      vs      am    gear                                              
 19.200   6.000 196.300 123.000   3.695   3.325  17.710   0.000   0.000   4.000                                              
   carb                                                                                                                      
  2.000 

Como puede ver, pasé trim = .5aunque no está especificado como un argumento formal de sapplyfunción.

(tenga en cuenta que este ejemplo es trivial, puede usarlo sapply(mtcars, median)para lograr el mismo resultado)

aL3xa
fuente
1
Si no está especificado, ¿cómo sabe que es legal o válido?
qed
@qed trimes un argumento de la meanfunción. Los ...in sapplyson el mecanismo al trimque se le pasará mean.
Richie Cotton