El lenguaje R está evolucionando e implementa polimorfismo paramétrico, lo que significa que los métodos en R se refieren a funciones, no a clases . El polimorfismo paramétrico le permite principalmente definir un método o una función genéricos para tipos de objetos que aún no ha definido y que es posible que nunca lo haga. Esto significa que uno puede usar el mismo nombre para varias funciones con diferentes conjuntos de argumentos y de varias clases. El mecanismo de llamada a métodos de R es genérico, lo que permite registrar ciertos nombres para que sean tratados como métodos en R, y actúan como despachadores.
Funciones genéricas
El polimorfismo en R puede obtenerse mediante los genéricos. Permite que ciertos nombres sean tratados como métodos y actúan como despachadores. Entendamos con la ayuda de la función plot() y la función de resumen. En la programación R, las funciones y devuelven diferentes resultados según los objetos que se les pasan y es por eso que son funciones genéricas que implementan polimorfismo.
parcela() en R
es una de las funciones genéricas que implementan el polimorfismo en R. Produce un gráfico diferente si se le da un vector , un factor , un marco de datos , etc. Pero, ¿alguna vez te has preguntado cómo la clase de vectores o factores determina el método utilizado? para tramar? Veamos el código de la función plot.
Ejemplo: código de la función de trama
R
plot
Producción:
function (x, y, ...) UseMethod("plot")
Podemos ver que el cuerpo de la función plot contiene solo una expresión y es UseMethod(“plot”). Veamos la definición de UseMethod con la ayuda de la función help().
Ejemplo: Definición del método help().
R
help(UseMethod)
Producción:
Del resultado anterior, podemos ver que UseMethod toma dos parámetros generic y object.
- El genérico es el nombre de la string que es el nombre de la función (parcela en este caso).
- Este es un objeto cuya clase determinará el método que se «enviará». Es decir, el objeto para el que se llamará al método genérico.
UseMethod luego busca la función de trazado adecuada que se necesita llamar creando una string del tipo plot.object. También podemos ver todos los métodos disponibles para la función de trazado.
Ejemplo:
R
methods(plot)
Producción:
Veamos cómo funcionan tomando argumentos y mostrando diferentes salidas
La entrada es un vector numérico
En este ejemplo, tomemos un solo vector numérico dentro de la función como parámetro.
R
# R program to illustrate # polymorphosim # X Window System Graphics (X11) X11(width = 15, height = 13) # The runif() function generates # random deviates of the uniform distribution x <- 3 * runif(40) + (1:30) par(mar = c(20, 20, 1, 1)) # type='l' is used to connect the points # of the scatter plots with lines. plot(x, type = 'l', col = '#343deb') # We can do mouse click or enter pressed z <- locator(1)
Producción:
Las entradas son dos vectores numéricos
Necesitamos pasar dos parámetros vectoriales y produce un gráfico de dispersión en consecuencia.
R
# R program to illustrate # polymorphosim # X Window System Graphics (X11) X11(width = 5, height = 3) # The runif() function generates random # deviates of the uniform distribution x <- runif(20) y <- runif(20) * x par(mar = c(2, 2, 0.3, 0.3)) # type = 'p' means as points, the output comes as scattered # pch stands for plot character. pch = 16 we get . character plot(x, y, type = 'p', pch = 16, col = '#ab1ab0') #Either mouse press or enter key press wait z <- locator(1)
Producción:
La entrada es un factor
Si pasamos factor como argumentos, obtenemos un patrón de gráfico de barras.
R
# R program to illustrate # polymorphosim # X Window System Graphics (X11) X11(width = 5, height = 8) # here fruits names are passed and barchart is produced as output f <- factor(c('apple', 'orange', 'apple', 'pear', 'orange', 'apple', 'apple', 'orange')) par(mar = c(2, 2, 0.6, 0.6)) # Using plot() plot(f, col = '#8f4c91') z <- locator(1)
Producción:
La entrada es un marco de datos
La función Plot toma el marco de datos como argumento y cada variable del marco de datos se grafica una contra la otra.
R
# R program to illustrate # polymorphosim # X Window System Graphics (X11) X11(width = 6, height = 6) set.seed(280870) x <- c(4, 3, 1, 2, 2, 4, 6, 4, 5, 5, 4, 4, 5, 4, 4, 8, 4, 1, 2, 7) y <- x * rnorm(20, 1, 0.3) z <- x * y # Takina a data frame df <- data.frame(x, y, z) par(mar = c(0.1, 0.1, 0.1, 0.1)) # Using plot() plot(df, col = '#a832a6', pch = 16, cex = 1.5) z <- locator(1)
Producción:
resumen() en R
También es una función genérica que implementa el polimorfismo en R. Se utiliza para producir resúmenes de los resultados de varias funciones de ajuste de modelos.
Ejemplo 1:
R
# R program to illustrate # polymorphosim # Rainbow colors and let us see summary of it colors <- c("violet", "indigo", "blue", "green", "yellow", "orange", "red") summary(colors)
Producción:
Length Class Mode 7 character character
Ejemplo 2:
Verifiquemos los resultados resumidos para state.region. En R, generalmente muestra cuáles son las regiones disponibles en «Noreste», «Sur», «Norte Central» y «Oeste». Usando la función, cualquiera puede pasar state.region como primer parámetro y como segundo paso, (opcionalmente) pasar el argumento «maxsum». “maxsum” indica cuántos niveles se deben mostrar para los factores en la salida.
R
# R program to illustrate # polymorphosim state.region # Provides summarised results under each region summary(state.region) # As maxsum is given as 3, totally we should have 3 regions # But here we have 4 regions and hence highest count region, # next highest count region is displayed and the other # regions are clubbed under Other summary(state.region, maxsum = 3)
Producción:
> state.region [1] South West West South West West [7] Northeast South South South West West [13] North Central North Central North Central North Central South South [19] Northeast South Northeast North Central North Central South [25] North Central West North Central West Northeast Northeast [31] West Northeast South North Central North Central South [37] West Northeast Northeast South North Central South [43] South West Northeast South West South [49] North Central West Levels: Northeast South North Central West > summary(state.region) Northeast South North Central West 9 16 12 13 > summary(state.region, maxsum = 3) South West (Other) 16 13 21
Ejemplo 3:
Si el conjunto de datos es muy grande, echemos un vistazo a cómo funciona la función.
R
# R program to illustrate # polymorphosim # 10 different data sets are taken using stats::rnorm x <- stats::rnorm(10) x # Let us cut the dataset to lie between -3 and 3 and # in this case, it will be # (-3,-2] (-2,-1] (-1,0] (0,1] (1,2] (2,3] c <- cut(x, breaks = -3:3) c # Summarized the available dataset under the given levels summary(c)
Producción:
> x [1] 0.66647846 -0.29140286 -0.29596477 -0.23432541 -0.02144178 1.56640107 0.64575227 [8] -0.23759734 0.73304657 -0.04201218 > c [1] (0,1] (-1,0] (-1,0] (-1,0] (-1,0] (1,2] (0,1] (-1,0] (0,1] (-1,0] Levels: (-3,-2] (-2,-1] (-1,0] (0,1] (1,2] (2,3] > summary(c) (-3,-2] (-2,-1] (-1,0] (0,1] (1,2] (2,3] 0 0 6 3 1 0
Hasta ahora, hemos descrito la función y que es una función polimórfica. Por medio de diferentes entradas, el comportamiento de la función cambia y produce salidas. Aquí podemos ver el concepto de polimorfismo. De manera similar, en función, por medio de parámetros variables, el mismo método es aplicable para proporcionar diferentes resultados estadísticos. Ahora vamos a crear nuestros propios métodos genéricos.
Creación de un método genérico
Creemos un banco de clases e intentemos crear nuestro propio método display() que usará el método print() y mostrará el contenido de la clase en el formato especificado por nosotros.
Para hacer esto, primero tenemos que crear una función genérica display() que usará la función UseMethod.
R
display <- function(obj){ UseMethod("print") }
Después de crear la función de visualización genérica, creemos la función de visualización para nuestro banco de clases.
R
print.bank<-function(obj) { cat("Name is ", obj$name, "\n") cat(obj$account_no, " is the Acc no of the holder\n ") cat(obj$saving, " is the amount of saving in the account \n ") cat(obj$withdrawn, " is the withdrawn amount\n") }
Ahora, veamos la salida dada por esta función.
R
x <- list(name ="Arjun", account_no = 1234, saving = 1500, withdrawn = 234) class(x)<-"bank" display <- function(obj){ UseMethod("print") } print.bank<-function(obj) { cat("Name is ", obj$name, "\n") cat(obj$account_no, " is the Acc no of the holder\n ") cat(obj$saving, " is the amount of saving in the account \n ") cat(obj$withdrawn, " is the withdrawn amount\n") } display(x)
Producción:
Name is Arjun 1234 is the Acc no of the holder 1500 is the amount of saving in the account 234 is the withdrawn amount
Publicación traducida automáticamente
Artículo escrito por priyarajtt y traducido por Barcelona Geeks. The original can be accessed here. Licence: CCBY-SA