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.