R – Programación Orientada a Objetos

En este artículo, discutiremos la programación orientada a objetos (POO) en el lenguaje de programación R. Analizaremos las clases S3 y S4, la herencia en estas clases y los métodos proporcionados por estas clases.

En la programación R, los OOP proporcionan clases y objetos como herramientas clave para reducir y administrar la complejidad del programa. R es un lenguaje funcional que utiliza conceptos de programación orientada a objetos. Podemos pensar en una clase como un boceto de un automóvil. Contiene todos los detalles sobre el modelo_nombre, modelo_no, motor, etc. En base a estas descripciones, seleccionamos un automóvil. El coche es el objeto. Cada objeto de automóvil tiene sus propias características y características. Un objeto también se denomina instancia de una clase y el proceso de creación de este objeto se denomina instanciación. En R , las clases S3 y S4 son las dos clases más importantes para la programación orientada a objetos. Pero antes de hablar de estas clases, veamos un resumen sobre las clases y los objetos.

Clase y Objeto

La clase es el modelo o un prototipo a partir del cual se crean objetos encapsulando funciones y miembros de datos. Un objeto es una estructura de datos que contiene algunos métodos que actúan sobre sus atributos. 

Objects of class student

Clase S3

La clase S3 no tiene una definición predefinida y puede enviarse. En esta clase, la función genérica hace una llamada al método. La fácil implementación de S3 es posible porque difiere del lenguaje de programación tradicional Java, C++ y C# que implementa el paso de mensajes orientado a objetos.

Crear clase S3

Para crear un objeto de esta clase crearemos una lista que contendrá todos los miembros de la clase. Luego, esta lista se pasa al método class() como argumento.

Sintaxis: 

nombre_variable <- lista(atributo1, atributo2, atributo3….atributoN)

Ejemplo: 

En el siguiente código, se define una clase Student. Se da un nombre de clase apropiado que tiene atributos como el nombre del estudiante y el número de registro. Luego se crea e invoca el objeto de la clase estudiante. 

R

# List creation with its attributes name
# and roll no.
a < - list(name="Adam", Roll_No=15)
 
# Defining a class "Student"
class(a) < - "Student"
 
# Creation of object
a

Producción:

$name
[1] "Adam"

$Roll_No
[1] 15

attr(, "class")
[1] "Student"

Funciones genéricas

Las funciones genéricas son un buen ejemplo de polimorfismo. Para comprender el concepto de funciones genéricas, considere la función print(). La función print() es una colección de varias funciones de impresión que se crean para diferentes tipos de datos y estructuras de datos en el lenguaje de programación R. Llama a la función apropiada dependiendo del tipo de objeto pasado como argumento. Podemos ver las diversas implementaciones de las funciones de impresión usando la función method().

Ejemplo: ver diferentes tipos de función de impresión

R

methods(print)

Producción:

r generic functions

Ahora vamos a crear una función genérica propia. Crearemos la función de impresión para nuestra clase que imprimirá todos los miembros en nuestro formato especificado. Pero antes de crear una función de impresión, creemos lo que la función de impresión le hace a nuestra clase.

 Ejemplo:

R

# List creation with its attributes name
# and roll no.
a = list(name="Adam", Roll_No=15)
 
# Defining a class "Student"
class(a) = "Student"
 
# Creation of object
print(a)

Producción:

$name
[1] "Adam"

$Roll_No
[1] 15

attr(,"class")
[1] "Student"

Ahora imprimamos todos los miembros en nuestro formato especificado. Considere el siguiente ejemplo:

Ejemplo:

R

print.Student <- function(obj){
  cat("name: " ,obj$name, "\n")
  cat("Roll No: ", obj$Roll_No, "\n")
}
 
print(a)

Producción:

name:  Adam 
Roll No:  15 

Atributos

Los atributos de un objeto no afectan el valor de un objeto, pero son una pieza de información adicional que se usa para manejar los objetos. La función atributos() se puede utilizar para ver los atributos de un objeto.

Ejemplos: se crea un objeto de S3 y se muestran sus atributos.

R

attributes(a)

Producción:

$names
'name''Roll_No'
$class
'Student'

Además, puede agregar atributos a un objeto usando attr. 

R

attr(a, "age")<-c(18)
attributes(a)

Producción:

$names
'name''Roll_No'
$class
'Student'
$age
18

Herencia en la clase S3

La herencia es un concepto importante en OOP (programación orientada a objetos) que permite que una clase obtenga las características y funcionalidades de otra clase. Esta función facilita la reutilización del código.

La clase S3 en el lenguaje de programación R no tiene una definición formal y fija. En un objeto de S3, una lista con su atributo de clase se establece en un nombre de clase. Los objetos de clase S3 heredan solo métodos de su clase base.

Ejemplo: 

En el siguiente código, la herencia se realiza utilizando la clase S3, primero se crea el objeto de la clase estudiante.

R

# student function with argument
# name(n) and roll_no(r)
student < - function(n, r) {
    value < - list(name=n, Roll=r)
    attr(value, "class") < - "student"
    value
}

Luego, se define el método para imprimir los datos del alumno. 

R

# 'print.student' method created
print.student < - function(obj) {
 
    # 'cat' function is used to concatenate
    # strings
    cat("Name:", obj$name, "\n")
    cat("Roll", obj$roll, "\n")}

Ahora, la herencia se realiza al crear otra clase haciendo class(obj) <- c(child, parent) .

R

s < - list(name="Kesha", Roll=21, country="India")
 
# child class 'Student' inherits
# parent class 'student'
class(s) < - c("Student", "student")
s

Producción: 

Name: Kesha 
Roll: 21 

El siguiente código sobrescribe el método para el estudiante de clase.

R

# 'Student' class object is passed
# in the function of class 'student'
 
print.student < - function(obj) {
    cat(obj$name, "is from", obj$country, "\n")
}
s

Producción:

Kesha is from India

Clase S4 

La clase S4 tiene una definición predefinida. Contiene funciones para definir métodos y genéricos. Facilita los envíos múltiples. Esta clase contiene funciones auxiliares para definir métodos y genéricos.

Creación de clase y objeto S4 

El comando setClass() se usa para crear la clase S4. A continuación se muestra la sintaxis del comando setclass que denota myclass con ranuras que contienen nombre y rollno.

Sintaxis: 

 setClass(“myclass”, slots=list(name=”character”, Roll_No=”numeric”))  

La función new() se utiliza para crear un objeto de la clase S4. En esta función, pasaremos el nombre de la clase así como el valor de las ranuras.

Ejemplo: 

R

# Function setClass() command used
# to create S4 class containing list of slots.
setClass("Student", slots=list(name="character",
                               Roll_No="numeric"))
 
# 'new' keyword used to create object of
# class 'Student'
a <- new("Student", name="Adam", Roll_No=20)
 
# Calling object
a

Producción: 

Slot "name":
[1] "Adam"

Slot "Roll_No":
[1] 20

Crear objetos S4 a partir de la función del generador

setClass() devuelve una función generadora que ayuda a crear objetos y actúa como constructor.

Ejemplo:

R

stud <- setClass("Student", slots=list(name="character",
                               Roll_No="numeric"))
 
# Calling object
stud

Producción:

new(“classGeneratorFunction”, .Data = función (…)

new(“Estudiante”, …), className = estructura(“Estudiante”, paquete = “.GlobalEnv”),

   paquete = “.GlobalEnv”)

Ahora la función de espárrago creada anteriormente actuará como el constructor de la clase Estudiante. Se comportará como la función new().

Ejemplo:

R

stud(name="Adam", Roll_No=15)

Producción:

An object of class "Student"
Slot "name":
[1] "Adam"

Slot "Roll_No":
[1] 15

Herencia en la clase S4

La clase S4 en la programación R tiene una definición adecuada y las clases derivadas podrán heredar tanto los atributos como los métodos de su clase base. Para esto, primero crearemos una clase base con los espacios apropiados y crearemos una función genérica para esa clase. Luego crearemos una clase derivada que heredará usando el parámetro contains. La clase derivada heredará los miembros y funciones de la clase base.

Ejemplo:

R

# Define S4 class
setClass("student",
         slots=list(name="character",
                    age="numeric", rno="numeric")
         )
 
# Defining a function to display object details
setMethod("show", "student",
          function(obj){
              cat(obj@name, "\n")
              cat(obj@age, "\n")
              cat(obj@rno, "\n")
          }
          )
 
# Inherit from student
setClass("InternationalStudent",
         slots=list(country="character"),
         contains="student"
         )
 
# Rest of the attributes will be inherited from student
s < - new("InternationalStudent", name="Adam",
          age=22, rno=15, country="India")
show(s)

Producción:

Adam 
22 
15

Las razones para definir las clases S3 y S4 son las siguientes: 

  • La clase S4 sola no se verá si se llama directamente a la función genérica S3. Este será el caso, por ejemplo, si alguna función llama a unique() desde un paquete que no hace que esa función sea genérica de S4.
  • Sin embargo, las funciones y los operadores primitivos son excepciones: el código C interno buscará métodos S4 si y solo si el objeto es un objeto S4. El envío del método S4 se usaría para enviar cualquier llamada de operador binario donde cualquiera de los operandos fuera un objeto S4.
  • La clase S3 sola no se llamará si hay algún método S4 no predeterminado elegible.

Entonces, si un paquete definió un método S3 para único para una clase S4 pero otro paquete definió un método S4 para una superclase de esa clase, se elegiría el método de la superclase, probablemente no lo que se pretendía.

Publicación traducida automáticamente

Artículo escrito por GeeksforGeeks-1 y traducido por Barcelona Geeks. The original can be accessed here. Licence: CCBY-SA

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *