Una función es un conjunto de declaraciones orquestadas juntas para realizar una operación específica. Una función es un objeto, por lo que el intérprete puede pasar el control a la función, junto con los argumentos que pueden ser necesarios para que la función realice las acciones. La función, a su vez, realiza la tarea y devuelve el control al intérprete, así como cualquier valor de retorno que pueda almacenarse en otros objetos.
¿Cómo definir una función?
En la programación R , una función se puede definir usando la función de palabra clave. La sintaxis para definir una función en R es la siguiente:
Sintaxis:
function_name = function(arg_1, arg_2, …)
{
Cuerpo de la función
}
Los diversos componentes/partes de una función son:
- Nombre de la función: Es el nombre real de la función. Se almacena en el entorno R como un objeto con este nombre.
- Argumentos: Un argumento es un marcador de posición. Cada vez que se invoca una función, se pasa un valor al argumento. Son opcionales; es decir, una función puede no contener argumentos. También los argumentos pueden tener valores predeterminados.
- Cuerpo de la función: contiene todo el conjunto de declaraciones que define lo que realmente hace la función.
- Valores devueltos: Son los valores que devuelve la función después de la ejecución exitosa de las tareas. En términos más generales, es la última expresión en el cuerpo de la función que se evaluará.
Llamar a una función
No es más que llamar a la función original con un número válido de argumentos. Se puede llamar a una función con un argumento, sin argumento y también con un valor predeterminado.
Ejemplo: llamar a una función sin un argumento
r
# create a function cube # without an argument cube <- function() { for(i in 1:10) { print(i^3) } } # calling function cube without an argument cube()
Producción:
[1] 1 [1] 8 [1] 27 [1] 64 [1] 125 [1] 216 [1] 343 [1] 512 [1] 729 [1] 1000
Ejemplo: Llamar a una función con un argumento.
r
# create a function factorial # with a numeric argument n factorial <- function(n) { if(n==0) { return(1) } else { return(n * factorial(n - 2)) } } # calling function cube with an argument factorial(7)
Producción:
[1] 5040
Ejemplo: llamar a una función con argumento predeterminado.
r
# create a function def_arg # without an argument def_arg <- function(a = 23, b = 35) { output <- (a + b) * a + (a - b) * b print(output) } # calling function def_arg without an argument def_arg() # call the function with giving new values of the argument. def_arg(16, 22)
Producción:
[1] 914 [1] 476
Tipos de función
Hay principalmente tres tipos de funciones en la programación R:
- Funciones primitivas
- Funciones infijas
- Funciones de reemplazo
Funciones primitivas
Generalmente, una función se compone de tres partes:
- Los formals() , la lista de argumentos que controlan cómo llamas a la función.
- El cuerpo() , el código dentro de la función.
- El entorno() , la estructura de datos que determina cómo la función encuentra los valores asociados con los nombres.
Los formales y el cuerpo se definen explícitamente cada vez que se crea una función, pero el entorno se especifica implícitamente, en función de dónde defina la función. Pero hay una excepción a la regla de que una función tiene tres componentes, algunas funciones llaman código C directamente. Estas funciones se conocen como funciones primitivas. Las funciones primitivas existen principalmente en C, no en R, por lo que sus formals() , body() y environment() son NULL. Estas funciones solo se encuentran en el paquete base. Las funciones primitivas son más difíciles de escribir pero son muy eficientes. Los hay de dos tipos, ya sea de tipo empotrado o de tipo especial.
r
typeof(sum) typeof('[')
[1] "builtin" #> typeof(sum) [1] "character" #> typeof('[')
Ejemplo: para imprimir los nombres de las funciones primitivas disponibles en su consola R, ejecute el siguiente código.
r
names(methods:::.BasicFunsList)
Producción:
[1] "$" "$<-" "[" "[<-" "[[" "[[=" "cosh" "cummax" "dimnames<-" [22] "as.raw" "log2" "tan" "dim" "as.logical" "^" "is.finite" [29] "sinh" "log10" "as.numeric" "dim<-" "is.array" "tanpi" "gamma" [36] "atan" "as.integer" "Arg" "signif" "cumprod" "cos" "length" [43] "!=" "digamma" "exp" "floor" "acos" "seq.int" "abs" [50] "length<-" "sqrt" "!" "acosh" "is.nan" "Re" "tanh" [57] "names" "cospi" "&" "anyNA" "trunc" "cummin" "levels<-" [64] "*" "Mod" "|" "names<-" "+" "log" "lgamma" [71] "as.complex" "asinh" "-" "sin" "/" "as.environment" "<=" [78] "as.double" "is.infinite" "is.numeric" "rep" "round" "sinpi" "dimnames" [85] "asin" "as.character" "%/%" "is.na" "" "Im" [92] "%%" "trigamma" "==" "cumsum" "atanh" "sign" "ceiling" [99] "Conj" "as.call" "log1p" "expm1" "(" ":" "=" [106] "@" "{" "~" "&&" ".C" "baseenv" "quote" [113] "<-" "is.name" "if" "||" "attr<-" "untracemem" ".cache_class" [120] "substitute" "interactive" "is.call" "switch" "function" "is.single" "is.null" [127] "is.language" "is.pairlist" ".External.graphics" "globalenv" "class<-" ".Primitive" "is.logical" [134] "enc2utf8" "UseMethod" ".subset" "proc.time" "enc2native" "repeat" "<<-" [141] "@<-" "missing" "nargs" "isS4" ".isMethodsDispatchOn" "forceAndCall" ".primTrace" [148] "storage.mode<-" ".Call" "unclass" "gc.time" ".subset2" "environment<-" "emptyenv" [155] "seq_len" ".External2" "is.symbol" "class" "on.exit" "is.raw" "for" [162] "is.complex" "list" "invisible" "is.character" "oldClass<-" "is.environment" "attributes" [169] "break" "return" "attr" "tracemem" "next" ".Call.graphics" "standardGeneric" [176] "is.atomic" "retracemem" "expression" "is.expression" "call" "is.object" "pos.to.env" [183] "attributes<-" ".primUntrace" "...length" ".External" "oldClass" ".Internal" ".Fortran" [190] "browser" "is.double" ".class2" "while" "nzchar" "is.list" "lazyLoadDBfetch" [197] "...elt" "is.integer" "is.function" "is.recursive" "seq_along" "unlist" "as.vector" [204] "lengths"
Funciones infijas
Las funciones infijas son aquellas funciones en las que el nombre de la función se encuentra entre sus argumentos y, por lo tanto, tienen dos argumentos. R viene con una serie de operadores infijos integrados como :, ::, :::, $, @, ^, *, /, +, -, >, >=, <, <=, ==, ! =, !, &, &&, |, ||, ~, <- y <<- . Uno puede crear sus propias funciones infijas que comienzan y terminan con %. El nombre de una función infija es más flexible ya que puede contener cualquier secuencia de caracteres excepto %. Hay algunos operadores infijos predefinidos en la programación R.
Operadores | Descripción |
---|---|
%% | operador de resto |
%/% | División entera |
%*% | Multiplicación de arrays |
%o% | Producto exterior |
%X% | producto Kronecker |
%en% | Operador coincidente |
Ejemplo: Cree una función de dos argumentos que proporcione el mayor de dos números y vincúlela a un nombre que comience y termine con %.
r
# R program to illustrate # Infix function '%Greater%' <- function(a, b) { if(a > b) print(a) else if(b > a) print(b) else print("equal") } 5 %Greater% 7 2300 %Greater% 67
Producción:
[1] 7 [1] 2300
Funciones de reemplazo
Las funciones de reemplazo modifican sus argumentos en su lugar (la modificación de un objeto R generalmente crea una copia). El nombre de las funciones de reemplazo siempre va seguido de <. Deben tener argumentos llamados x y valor, y devolver el objeto modificado. En caso de reemplazo, una función necesita argumentos adicionales, los argumentos adicionales deben colocarse entre x y valor, y deben llamarse con argumentos adicionales a la izquierda. El nombre de la función tiene que estar entrecomillado ya que es un nombre sintácticamente válido pero no estándar y el analizador interpretaría <- como el operador no como parte del nombre de la función si no estuviera entrecomillado.
Sintaxis:
“nombre_función<-” <- función(x, argumentos adicionales, valor)
{
cuerpo de la función
}
Ejemplo:
r
# R program to illustrate # Replacement function "replace<-" <- function(x, value) { x[1] = value x } x = rep.int(5, 7) replace(x) = 0L print(x)
Producción:
[1] 0 5 5 5 5 5 5
Publicación traducida automáticamente
Artículo escrito por misraaakash1998 y traducido por Barcelona Geeks. The original can be accessed here. Licence: CCBY-SA