Clase S3 en Programación R

Todas las cosas en el lenguaje R se consideran objetos. Los objetos tienen atributos y el atributo más común relacionado con un objeto es la clase. La clase de comando se usa para definir una clase de un objeto o aprender sobre las clases de un objeto. 
La clase es un vector y esta propiedad permite dos cosas: 
 

  • Los objetos pueden heredar de numerosas clases.
  • El orden de herencia se puede especificar para clases complejas

Ejemplo: comprobar la clase de un objeto 
 

Python3

# Creating a vector x consisting of type of genders
x<-c("female", "male", "male", "female")
 
# Using the command <code>class()</code>
# to check the class of the vector
class(x)

Producción: 
 

[1] "character"

Ejemplo: agregar la clase de un objeto 
 

Python3

# Creating a vector x consisting of type of genders
x<-c("female", "male", "male", "female")
 
# Using the command <code>class()</code>
# to append the class of the vector
class(x)<-append(class(x), "Gender")
class(x)

Producción: 
 

[1] "character" "Gender"   

Gestión de la memoria

Al hacer programación orientada a objetos, el programador puede tener dudas sobre qué clase usar: ¿S3 O S4? 
Al comparar ambas clases, S4 tiene un enfoque más estructurado, mientras que S3 se considera una clase flexible.
Los entornos de memoria son responsables de la flexibilidad en las clases de S3. 
Un entorno es como un ámbito local y tiene un conjunto de variables asociado. Estas variables son accesibles si se conoce el ‘ID’ asociado con el entorno.
Para conocer o establecer los valores de una variable en un entorno, se utilizan comandos como asignar y obtener .
Ejemplo: Asignar y obtener valores de una variable dentro del entorno 
 

Python3

# Creating a vector x consisting of type of genders
# Creating a vector for age
age<-c(12, 10, 09)
 
# The command environment() can be used
# to bring the pointer to current environment
e <- environment()
e
 
# Setting the value of the variable
assign("age", 3, e)
ls()
 
# Getting the values of the variable
get("age", e)

Producción: 
 

[1] "age" "e"   "x"  
[1] 3   

Los entornos se pueden crear fácilmente. También se pueden incrustar en otros entornos. 
 

Creando una clase S3

Una clase S3 es la clase más frecuente y utilizada en la programación R. Es fácil implementar esta clase y la mayoría de las clases predefinidas son de este tipo. 
Un objeto S3 es básicamente una lista con sus atributos de clase asignados algunos nombres. Y la variable miembro del objeto creado son los componentes de la lista.
Para crear un objeto S3 hay dos pasos principales: 
 

  • Cree una lista (digamos x) con los componentes requeridos
  • Luego, la clase se puede formar mediante la clase de comando (x) y se debe asignar un nombre a esta clase.

Ejemplos: se puede crear fácilmente un objeto S3 de detalles de cuentas bancarias. 
 

Python3

x <- list(name ="Arjun", account_no = 1234,
          saving = 1500, withdrawn = 234)
class(x)<-"bank"
x
Output: 
$name
[1] "Arjun"

$account_no
[1] 1234

$saving
[1] 1500

$withdrawn
[1] 234

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

Ejemplos: se puede crear fácilmente un objeto S3 del currículum de una persona.
 

Python3

x <- list(name ="Arjun", percentage = 95,
          school_name ="ST Xavier")
class(x)<-"resume"
x

Producción: 
 

$name
[1] "Arjun"

$percentage
[1] 95

$school_name
[1] "ST Xavier"

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

Otros lenguajes como Python, Java, C++, etc. tienen una definición adecuada para la clase y los objetos tienen métodos y atributos definidos adecuados. 
Pero en el lenguaje R en el sistema de clases S3, es flexible e incluso puedes modificarlos o convertirlos (el objeto de la misma clase puede ser diferente).
El sistema S3 en lenguaje R consta de tres componentes principales 
 

  • función genérica
  • método
  • atributos

Funciones genéricas

R usa la función print() muy a menudo. Si escribe el nombre de la clase, se imprimirán sus partes internas o puede usar el comando imprimir (nombre de la clase). Pero la misma función print() se usa para imprimir cosas diferentes como: vectores, marcos de datos, arrays, etc. 
 

¿Cómo reconoce print() esta variedad de entradas?

La función print() es una función genérica y por lo tanto es una colección de métodos. Estos métodos se pueden verificar aún más escribiendo los métodos de comando (imprimir).
 

Python3

methods(print)

Producción: 
 

 
  [1] print.AES*                                        
  [2] print.Arima*                                      
  [3] print.AsIs                                        
  [4] print.Bibtex*                                     
  [5] print.CRAN_package_reverse_dependencies_and_views*
  [6] print.DLLInfo                                     
  [7] print.DLLInfoList                                 
  [8] print.DLLRegisteredRoutines                       
  [9] print.Date                                        
 [10] print.Dlist                                       
 [11] print.HoltWinters*                                
 [12] print.LaTeX*                                      
 [13] print.Latex*                                      
 [14] print.MethodsFunction*                            
 [15] print.NativeRoutineList                           
 [16] print.PDF_Array*                                  
 [17] print.PDF_Dictionary*                             
 [18] print.PDF_Indirect_Reference*                     
 [19] print.PDF_Keyword*                                
 [20] print.PDF_Name*                                   
 [21] print.PDF_Stream*                                 
 [22] print.PDF_String*                                 
 [23] print.POSIXct                                     
 [24] print.POSIXlt                                     
 [25] print.R6*                                         
 [26] print.R6ClassGenerator*                           
 [27] print.RGBcolorConverter*                          
 [28] print.Rcpp_stack_trace*                           
 [29] print.Rd*                                         
 [30] print.SOCK0node*                                  
 [31] print.SOCKcluster*                                
 [32] print.SOCKnode*                                   
 [33] print.State*                                      
 [34] print.StructTS*                                   
 [35] print.TukeyHSD*                                   
 [36] print.acf*                                        
 [37] print.anova*                                      
 [38] print.aov*                                        
 [39] print.aovlist*                                    
 [40] print.ar*                                         
 [41] print.arima0*                                     
 [42] print.aspell*                                     
 [43] print.aspell_inspect_context*                     
 [44] print.bibentry*                                   
 [45] print.browseVignettes*                            
 [46] print.by                                          
 [47] print.bytes*                                      
 [48] print.changedFiles*                               
 [49] print.checkDocFiles*                              
 [50] print.checkDocStyle*                              
 [51] print.checkFF*                                    
 [52] print.checkRd*                                    
 [53] print.checkReplaceFuns*                           
 [54] print.checkS3methods*                             
 [55] print.checkTnF*                                   
 [56] print.checkVignettes*                             
 [57] print.check_Rd_contents*                          
 [58] print.check_Rd_line_widths*                       
 [59] print.check_Rd_metadata*                          
 [60] print.check_Rd_xrefs*                             
 [61] print.check_RegSym_calls*                         
 [62] print.check_T_and_F*                              
 [63] print.check_code_usage_in_package*                
 [64] print.check_compiled_code*                        
 [65] print.check_demo_index*                           
 [66] print.check_depdef*                               
 [67] print.check_details*                              
 [68] print.check_details_changes*                      
 [69] print.check_doi_db*                               
 [70] print.check_dotInternal*                          
 [71] print.check_make_vars*                            
 [72] print.check_nonAPI_calls*                         
 [73] print.check_package_CRAN_incoming*                
 [74] print.check_package_code_assign_to_globalenv*     
 [75] print.check_package_code_attach*                  
 [76] print.check_package_code_data_into_globalenv*     
 [77] print.check_package_code_startup_functions*       
 [78] print.check_package_code_syntax*                  
 [79] print.check_package_code_unload_functions*        
 [80] print.check_package_compact_datasets*             
 [81] print.check_package_datasets*                     
 [82] print.check_package_depends*                      
 [83] print.check_package_description*                  
 [84] print.check_package_description_encoding*         
 [85] print.check_package_license*                      
 [86] print.check_packages_in_dir*                      
 [87] print.check_packages_used*                        
 [88] print.check_po_files*                             
 [89] print.check_so_symbols*                           
 [90] print.check_url_db*                               
 [91] print.check_vignette_index*                       
 [92] print.citation*                                   
 [93] print.codoc*                                      
 [94] print.codocClasses*                               
 [95] print.codocData*                                  
 [96] print.colorConverter*                             
 [97] print.compactPDF*                                 
 [98] print.condition                                   
 [99] print.connection                                  
[100] print.data.frame                                  
[101] print.default                                     
[102] print.dendrogram*                                 
[103] print.density*                                    
[104] print.difftime                                    
[105] print.dist*                                       
[106] print.dummy_coef*                                 
[107] print.dummy_coef_list*                            
[108] print.ecdf*                                       
[109] print.eigen                                       
[110] print.factanal*                                   
[111] print.factor                                      
[112] print.family*                                     
[113] print.fileSnapshot*                               
[114] print.findLineNumResult*                          
[115] print.formula*                                    
[116] print.fseq*                                       
[117] print.ftable*                                     
[118] print.function                                    
[119] print.getAnywhere*                                
[120] print.glm*                                        
[121] print.hclust*                                     
[122] print.help_files_with_topic*                      
[123] print.hexmode                                     
[124] print.hsearch*                                    
[125] print.hsearch_db*                                 
[126] print.htest*                                      
[127] print.html*                                       
[128] print.html_dependency*                            
[129] print.htmlwidget*                                 
[130] print.infl*                                       
[131] print.integrate*                                  
[132] print.isoreg*                                     
[133] print.kmeans*                                     
[134] print.libraryIQR                                  
[135] print.listof                                      
[136] print.lm*                                         
[137] print.loadings*                                   
[138] print.loess*                                      
[139] print.logLik*                                     
[140] print.ls_str*                                     
[141] print.medpolish*                                  
[142] print.mtable*                                     
[143] print.news_db*                                    
[144] print.nls*                                        
[145] print.noquote                                     
[146] print.numeric_version                             
[147] print.object_size*                                
[148] print.octmode                                     
[149] print.packageDescription*                         
[150] print.packageIQR*                                 
[151] print.packageInfo                                 
[152] print.packageStatus*                              
[153] print.pairwise.htest*                             
[154] print.pdf_doc*                                    
[155] print.pdf_fonts*                                  
[156] print.pdf_info*                                   
[157] print.person*                                     
[158] print.power.htest*                                
[159] print.ppr*                                        
[160] print.prcomp*                                     
[161] print.princomp*                                   
[162] print.proc_time                                   
[163] print.raster*                                     
[164] print.recordedplot*                               
[165] print.restart                                     
[166] print.rle                                         
[167] print.roman*                                      
[168] print.sessionInfo*                                
[169] print.shiny.tag*                                  
[170] print.shiny.tag.list*                             
[171] print.simple.list                                 
[172] print.smooth.spline*                              
[173] print.socket*                                     
[174] print.srcfile                                     
[175] print.srcref                                      
[176] print.stepfun*                                    
[177] print.stl*                                        
[178] print.subdir_tests*                               
[179] print.summarize_CRAN_check_status*                
[180] print.summary.aov*                                
[181] print.summary.aovlist*                            
[182] print.summary.ecdf*                               
[183] print.summary.glm*                                
[184] print.summary.lm*                                 
[185] print.summary.loess*                              
[186] print.summary.manova*                             
[187] print.summary.nls*                                
[188] print.summary.packageStatus*                      
[189] print.summary.ppr*                                
[190] print.summary.prcomp*                             
[191] print.summary.princomp*                           
[192] print.summary.table                               
[193] print.summaryDefault                              
[194] print.suppress_viewer*                            
[195] print.table                                       
[196] print.tables_aov*                                 
[197] print.terms*                                      
[198] print.ts*                                         
[199] print.tskernel*                                   
[200] print.tukeyline*                                  
[201] print.tukeysmooth*                                
[202] print.undoc*                                      
[203] print.vignette*                                   
[204] print.warnings                                    
[205] print.xgettext*                                   
[206] print.xngettext*                                  
[207] print.xtabs*                                      

En la larga lista anterior hay métodos importantes como print.factor(). Cuando imprimimos un factor a través de la función print(), la llamada se enviaría automáticamente a print.factor()
La clase creada como – banco, buscaría un método llamado print.bank(), y dado que no existe tal método, print.default() se utiliza. 
Las funciones genéricas tienen un método predeterminado que se utiliza cuando no hay ninguna coincidencia disponible.
 

Creando tu propio método

Es posible crear su propio método. 
Ahora si la clase – ‘bank’ busca print.bank(), encontrará este método y lo usará si ya lo hemos creado. 
 

Python3

x <- list(name ="Arjun", account_no = 1234,
          saving = 1500, withdrawn = 234)
class(x)<-"bank"
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")
}
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

De manera general, los métodos de creación ahora se pueden definir y comprender fácilmente. 
 

  • En primer lugar, defina una función (de forma genérica) existente fuera de la clase.
  • En segundo lugar, definir los detalles de la función para una clase determinada.

Según los nombres de clase de un argumento para la función y el sufijo escrito en los nombres de las funciones asociadas, los entornos R determinan qué función usar. 
 

Python3

# Defining a function
indian <- function(eatslunch = TRUE, myFavorite ="daal")
{
    me <- list(haslunch = eatslunch,
               favoritelunch = myFavorite)
 
    # Set the name for the class
    class(me) <- append(class(me), "indian")
    return(me)
}
 
# Reserving the name of the function and
# by using the command <code>UseMethod</code>
# R will search for the appropriate function.
setHaslunch <- function(e, newValue)
{
    print("Calling the base setHaslunch function")
    UseMethod("setHaslunch", e)
    print(" this is not executed")
}
  
setHaslunch.default <- function(e, newValue)
{
    print("This objects is unable to be handled.")
    return(e)
}
 
setHaslunch.indian <- function(e, newValue)
{
    print("R is in setHaslunch.indian and is setting the value")
    e$haslunch <- newValue
    return(e)
}
 
# objects calling functions
foodie <- indian()
foodie$haslunch
foodie <- setHaslunch(foodie, FALSE)
foodie$haslunch

Producción: 
 

 
[1] TRUE
[1] "Calling the base setHaslunch function"
[1] "R is in setHaslunch.indian and is setting the value"
[1] FALSE 

Atributos

Los atributos de un objeto no afectan el valor de un objeto, pero son una pieza de información adicional que se utiliza 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.
 

Python3

# Defining a function
x <- list(name ="Arjun", percentage = 95,
          school_name ="ST Xavier")
attributes(x)

Producción: 
 

 
$names
[1] "name"        "percentage"  "school_name"

$class
[1] "resume"

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

Python3

# Defining a function
x <- list(name ="Arju", percentage = 95,
          school_name ="ST Xavie")
attr(x, "age")<-c(18)
attributes(x)

Producción: 
 

$names
[1] "name"        "percentage"  "school_name"

$age
[1] 18

El S3 ha sido nombrado así porque se originó en la tercera versión del lenguaje S. S es un lenguaje de programación que luego se modificó en R y S plus.
 

Publicación traducida automáticamente

Artículo escrito por support3 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 *