Saltar al contenido principal
LibreTexts Español

4.11: Funciones genéricas

  • Page ID
    151444
  • \( \newcommand{\vecs}[1]{\overset { \scriptstyle \rightharpoonup} {\mathbf{#1}} } \) \( \newcommand{\vecd}[1]{\overset{-\!-\!\rightharpoonup}{\vphantom{a}\smash {#1}}} \)\(\newcommand{\id}{\mathrm{id}}\) \( \newcommand{\Span}{\mathrm{span}}\) \( \newcommand{\kernel}{\mathrm{null}\,}\) \( \newcommand{\range}{\mathrm{range}\,}\) \( \newcommand{\RealPart}{\mathrm{Re}}\) \( \newcommand{\ImaginaryPart}{\mathrm{Im}}\) \( \newcommand{\Argument}{\mathrm{Arg}}\) \( \newcommand{\norm}[1]{\| #1 \|}\) \( \newcommand{\inner}[2]{\langle #1, #2 \rangle}\) \( \newcommand{\Span}{\mathrm{span}}\) \(\newcommand{\id}{\mathrm{id}}\) \( \newcommand{\Span}{\mathrm{span}}\) \( \newcommand{\kernel}{\mathrm{null}\,}\) \( \newcommand{\range}{\mathrm{range}\,}\) \( \newcommand{\RealPart}{\mathrm{Re}}\) \( \newcommand{\ImaginaryPart}{\mathrm{Im}}\) \( \newcommand{\Argument}{\mathrm{Arg}}\) \( \newcommand{\norm}[1]{\| #1 \|}\) \( \newcommand{\inner}[2]{\langle #1, #2 \rangle}\) \( \newcommand{\Span}{\mathrm{span}}\)\(\newcommand{\AA}{\unicode[.8,0]{x212B}}\)

    Hay una cosa realmente importante que omití cuando discutí funciones anteriormente en la Sección 3.5, y ese es el concepto de una función genérica. Los dos ejemplos más notables que verás en los próximos capítulos son summary () y plot (), aunque ya has visto un ejemplo de uno trabajando detrás de escena, y esa es la función print (). Lo que hace que los genéricos sean diferentes de las otras funciones es que su comportamiento cambia, a menudo bastante dramáticamente, dependiendo de la clase () de la entrada que le des. La forma más fácil de explicar el concepto es con un ejemplo. Con eso en mente, echemos un vistazo más de cerca a lo que realmente hace la función print (). Voy a hacer esto creando una fórmula, e imprimiéndola de varias maneras diferentes. Primero, sigamos con lo que sabemos:

    my.formula <- blah ~ blah.blah    # create a variable of class "formula"
    print( my.formula )               # print it out using the generic print() function
    ## blah ~ blah.blah

    Hasta el momento, aquí no hay nada muy sorprendente. Pero en realidad están pasando muchas cosas detrás de escena aquí. Cuando escribo print (my.formula), lo que realmente sucede es que la función print () verifica la clase de la variable my.formula. Cuando la función descubre que la variable que se le ha dado es una fórmula, va buscando una función llamada print.formula (), y luego delega todo el negocio de imprimir la variable a la función print.formula (). 63 Por lo que vale, el nombre de una función “dedicada” como print.formula () que existe solo para ser un caso especial de una función genérica como print () es un método, y el nombre para el proceso en el que el función genérica pasa todo el trabajo duro a un método se llama método despacho. No necesitarás entender en absoluto los detalles de este libro, pero sí necesitas saber lo esencial del mismo; aunque solo sea porque muchas de las funciones que usaremos son en realidad genéricos. De todos modos, para ayudarte a exponerte un poco más del funcionamiento, vamos a omitir por completo la función print () y llamemos al método de fórmula directamente:

    print.formula( my.formula )       # print it out using the print.formula() method
    
    ## Appears to be deprecated

    No hay ninguna diferencia en la salida en absoluto. Pero esto no debería sorprenderte porque en realidad era el método print.formula () el que estaba haciendo todo el trabajo duro en primer lugar. La función print () en sí es un bastardo perezoso que no hace otra cosa que seleccionar cuál de los métodos va a hacer la impresión real.

    Bien, bastante justo, pero tal vez te estés preguntando ¿qué hubiera pasado si print.formula () no existiera? Es decir, ¿qué pasa si no hay un método específico definido para la clase de variable que estás usando? En ese caso, la función genérica pasa el trabajo duro a un método “default”, cuyo nombre en este caso sería print.default (). Veamos qué sucede si omitimos la fórmula print () e intentamos imprimir my.formula usando la función print.default ():

    print.default( my.formula )      # print it out using the print.default() method
    ## blah ~ blah.blah
    ## attr(,"class")
    ## [1] "formula"
    ## attr(,".Environment")
    ## <environment: R_GlobalEnv>
    

    Hm. Se puede ver que está tratando de imprimir la misma fórmula, pero hay un montón de feos detalles de bajo nivel que también han surgido en la pantalla. Esto se debe a que el método print.default () no sabe nada de fórmulas, y no sabe que se supone que esté ocultando el odioso galimatías interno que R produce a veces.

    En esta etapa, esto es todo lo que necesitamos saber sobre las funciones genéricas y sus métodos. De hecho, puedes pasar por todo el libro sin aprender más sobre ellos que esto, así que probablemente sea una buena idea terminar esta discusión aquí.


    This page titled 4.11: Funciones genéricas is shared under a CC BY-SA 4.0 license and was authored, remixed, and/or curated by Danielle Navarro via source content that was edited to the style and standards of the LibreTexts platform; a detailed edit history is available upon request.