Protocolo:
Daniel Felipe Villa Rengifo
Lenguaje Utilizado: R
Tema: Funciones en R. Clases de funciones. Funciones incorporadas (built-in).
Fuentes Utilizadas:
Las funciones son útiles cuando se desea realizar una determinada tarea varias veces. Una función acepta argumentos de entrada y produce la salida ejecutando comandos válidos de R que están dentro de la función. En R, cuando se crea una función, el nombre de la función y el archivo en el que se crea la función no tienen por qué ser el mismo y se pueden tener una o más definiciones de funciones en un solo archivo de R.
Las funciones se crean en R utilizando el comando function()
.
function_name = function(argumentos){
cuerpo de la función
}
# Segunda forma de definir una función:
"Cambia solo el hecho del = por un <-"
function_name <- function(argumentos){
cuerpo de la función
}
Nota: depués nos daremos cuenta que se pueden definir de diferentes maneras, es decir, hay casos donde las funciones tienen otra sintaxis
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. Siempre que se invoca una función, se pasa un valor al argumento. Son opcionales; es decir, una función puede no contener argumentos. Además, 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 de retorno: Son los valores que devuelve la función después de la ejecución exitosa de las tareas, en general, es la última expresión en el cuerpo de la función a ser evaluada.
#Definir una función que saque la potencia de dos numeros Enteros, si el que es el exponente es numeric (Float), dara un mensaje que no se pude realizar:
message("#Definir una función que saque la potencia de dos numeros Enteros, si el que es el exponente es numeric (Float), dara un mensaje que no se pude realizar:")
## #Definir una función que saque la potencia de dos numeros Enteros, si el que es el exponente es numeric (Float), dara un mensaje que no se pude realizar:
potencia <- function(x,y){
# Calcula la potencia de x a la y (y debe ser integer)
if(is.integer(y) == TRUE){
resultado <- x^y
print(paste(x, "elevado a la", y, "es igual a =>",resultado))
}
else{
cat("Ingrese un valor entero para y:", y, "<=>", "is.integer(y) =>",is.integer(y))
cat("\nRecuerde un valor entero en R se define con una \"L\" (Mayuscula)")
}
}
print(potencia)
## function(x,y){
## # Calcula la potencia de x a la y (y debe ser integer)
## if(is.integer(y) == TRUE){
## resultado <- x^y
## print(paste(x, "elevado a la", y, "es igual a =>",resultado))
## }
## else{
## cat("Ingrese un valor entero para y:", y, "<=>", "is.integer(y) =>",is.integer(y))
## cat("\nRecuerde un valor entero en R se define con una \"L\" (Mayuscula)")
## }
## }
## Ahora la probamos con algunos valores:
message("\n## Ahora la probamos con algunos valores:")
##
## ## Ahora la probamos con algunos valores:
## Definimos un vector con numeros enteros pseudos-aletorios:
message("\n## Definimos un vector con numeros enteros pseudos-aletorios:")
##
## ## Definimos un vector con numeros enteros pseudos-aletorios:
enteros <- sample.int(10, size = 5, replace = TRUE)
for (i in enteros) {
# Evalumaos la función con valores con un bucle for:
p <- potencia(i-2, i)
print(p)
}
## [1] "-1 elevado a la 1 es igual a => -1"
## [1] "-1 elevado a la 1 es igual a => -1"
## [1] "1 elevado a la 3 es igual a => 1"
## [1] "1 elevado a la 3 es igual a => 1"
## [1] "3 elevado a la 5 es igual a => 243"
## [1] "3 elevado a la 5 es igual a => 243"
## [1] "8 elevado a la 10 es igual a => 1073741824"
## [1] "8 elevado a la 10 es igual a => 1073741824"
## [1] "8 elevado a la 10 es igual a => 1073741824"
## [1] "8 elevado a la 10 es igual a => 1073741824"
Ahora vamos a definir funciones que nos devuelvan valores con el return()
que hace que nuestra función salga y devuelva el valor a su llamador.
# Definimos nuestra función con return():
message("\n# Definimos nuestra función con return():")
##
## # Definimos nuestra función con return():
## Haremos un función que devuelva un valor lógico, donde nos devuelva True si el numero dado es par ó FALSE en caso contrario:
message("\n## Haremos un función que devuelva un valor lógico, donde nos devuelva True si el numero dado es par ó FALSE en caso contrario:")
##
## ## Haremos un función que devuelva un valor lógico, donde nos devuelva True si el numero dado es par ó FALSE en caso contrario:
par <- function(p){
# ¿Es par o no?:
if(p %% 2 == 0){
return(paste(p,"=> Es par"))
}
else{
return(paste(p, "=> No es Par, observa p %% 2 ==", p%%2))
}
}
# Probamos nuestra función par:
message("\n# Probamos nuestra función par:")
##
## # Probamos nuestra función par:
par(1.9)
## [1] "1.9 => No es Par, observa p %% 2 == 1.9"
par(2L)
## [1] "2 => Es par"
par(12354)
## [1] "12354 => Es par"
## Probemos con más de un valor a la vez:
message("\n## Probemos con más de un valor a la vez:")
##
## ## Probemos con más de un valor a la vez:
for (x in 2:15) {
print(par(sample.int(x, size = 1, replace = TRUE)))
}
## [1] "1 => No es Par, observa p %% 2 == 1"
## [1] "3 => No es Par, observa p %% 2 == 1"
## [1] "4 => Es par"
## [1] "4 => Es par"
## [1] "1 => No es Par, observa p %% 2 == 1"
## [1] "6 => Es par"
## [1] "2 => Es par"
## [1] "2 => Es par"
## [1] "3 => No es Par, observa p %% 2 == 1"
## [1] "6 => Es par"
## [1] "3 => No es Par, observa p %% 2 == 1"
## [1] "11 => No es Par, observa p %% 2 == 1"
## [1] "6 => Es par"
## [1] "7 => No es Par, observa p %% 2 == 1"
Estas son las funciones que vienen con R para abordar una tarea específica tomando un argumento como entrada y dando una salida basada en la entrada dada.
Miremos algunas de ellas (Son Muchas…la verdad dejare un link de ahí una guía functions Built-in)
Devuelve el orden Ascendente o Descendente (decreasing =
FALSE
ó TRUE
, respectivamente) de un vector x
cualesquiera.
Sintaxis: sort(x, decreasing = FALSE por defecto)
# Organicemos un vector cualesquiera con decimales:
message("\n# Organicemos un vector cualesquiera con decimales:")
##
## # Organicemos un vector cualesquiera con decimales:
x <- runif(10, min = 0, max = 15)
cat("Orden inicial de x:",x)
## Orden inicial de x: 4.851619 1.917701 12.69663 11.55648 6.584295 1.59472 2.294984 7.896877 12.29834 11.3063
## Orden ascendente:
message("\n## Orden ascendente:")
##
## ## Orden ascendente:
orden_as <- sort(x)
print(orden_as)
## [1] 1.594720 1.917701 2.294984 4.851619 6.584295 7.896877 11.306303
## [8] 11.556478 12.298336 12.696635
## Orden Descendente:
message("\n## Orden Descendente:")
##
## ## Orden Descendente:
orden_des <- sort(x, decreasing = TRUE)
print(orden_des)
## [1] 12.696635 12.298336 11.556478 11.306303 7.896877 6.584295 4.851619
## [8] 2.294984 1.917701 1.594720
Genera una secuencia del número entre dos números especificados.
Sintaxis: seq (Secuencia de numeros como numeric) & seq.int (secuencia de numeros enteros[integer])
seq.int(from, to, by, length.out, along.with)
Aquí está la explicación de sus parámetros:
from
& to
valor inicial y final de la secuencia.
by
Incremento/espacio entre dos números consecutivos en secuencia.
length.out
la longitud requerida de la secuencia.
along.with
: se refiere a la longitud a partir de la longitud de este argumento.
print(seq(from = 12.3, to = 60.32, by = 0.3))
## [1] 12.3 12.6 12.9 13.2 13.5 13.8 14.1 14.4 14.7 15.0 15.3 15.6 15.9 16.2 16.5
## [16] 16.8 17.1 17.4 17.7 18.0 18.3 18.6 18.9 19.2 19.5 19.8 20.1 20.4 20.7 21.0
## [31] 21.3 21.6 21.9 22.2 22.5 22.8 23.1 23.4 23.7 24.0 24.3 24.6 24.9 25.2 25.5
## [46] 25.8 26.1 26.4 26.7 27.0 27.3 27.6 27.9 28.2 28.5 28.8 29.1 29.4 29.7 30.0
## [61] 30.3 30.6 30.9 31.2 31.5 31.8 32.1 32.4 32.7 33.0 33.3 33.6 33.9 34.2 34.5
## [76] 34.8 35.1 35.4 35.7 36.0 36.3 36.6 36.9 37.2 37.5 37.8 38.1 38.4 38.7 39.0
## [91] 39.3 39.6 39.9 40.2 40.5 40.8 41.1 41.4 41.7 42.0 42.3 42.6 42.9 43.2 43.5
## [106] 43.8 44.1 44.4 44.7 45.0 45.3 45.6 45.9 46.2 46.5 46.8 47.1 47.4 47.7 48.0
## [121] 48.3 48.6 48.9 49.2 49.5 49.8 50.1 50.4 50.7 51.0 51.3 51.6 51.9 52.2 52.5
## [136] 52.8 53.1 53.4 53.7 54.0 54.3 54.6 54.9 55.2 55.5 55.8 56.1 56.4 56.7 57.0
## [151] 57.3 57.6 57.9 58.2 58.5 58.8 59.1 59.4 59.7 60.0 60.3
Las dos funciones, toupper y tolower, son funciones que se aplican a la cadena para cambiar las mayúsculas y minúsculas de las letras en las oraciones.
# Todas en mayusculas:
message("\n# Todas en mayusculas:")
##
## # Todas en mayusculas:
toupper("Sirve para poner todo en mayuscula")
## [1] "SIRVE PARA PONER TODO EN MAYUSCULA"
# Todo en minuscula:
message("\n# Todo en minuscula:")
##
## # Todo en minuscula:
tolower("Este Texto Sirve de Ejemplo")
## [1] "este texto sirve de ejemplo"
Esta función replica el valor tantas veces como se especifique.
Sintaxis: rep(value, # de veces a repetir)
# Llamamos a un vector pasado y lo ponemso a iteroa en el bucle donde utlizaremos rep
for (i in enteros) {
# Repetimos "i" 5 veces.
print(rep(i,5))
}
## [1] 1 1 1 1 1
## [1] 3 3 3 3 3
## [1] 5 5 5 5 5
## [1] 10 10 10 10 10
## [1] 10 10 10 10 10
Esta función es para concatenar cadenas junto con algún carácter específico en el medio.
Sintaxis: paste(x, sep= " ", collapse= NULL)
# Ulizando paste() para expresar mi gusto por la Hamburgesa:
message("\n# Ulizando paste() para expresar mi gusto por la Hamburgesa:")
##
## # Ulizando paste() para expresar mi gusto por la Hamburgesa:
cat(paste("Mi Comentario\n","Hamburgesa", "Papas Fritas", "CocaCola", sep = "||Yo amo la: "))
## Mi Comentario
## ||Yo amo la: Hamburgesa||Yo amo la: Papas Fritas||Yo amo la: CocaCola
message("\nEntre Otras........\n")
##
## Entre Otras........
Entre Otras……..
R proporciona una amplia variedad de funciones matemáticas.
Esta función calcula la raíz cuadrada de un número o vector numérico.
# Calculamos reiices cuadarada de los numeros aletorios dados por i
for (t in sample.int(15, size = 15, replace = FALSE)) {
print(paste("La raiz cuadrada de",t , "Es =>", sqrt(t)))
}
## [1] "La raiz cuadrada de 5 Es => 2.23606797749979"
## [1] "La raiz cuadrada de 8 Es => 2.82842712474619"
## [1] "La raiz cuadrada de 15 Es => 3.87298334620742"
## [1] "La raiz cuadrada de 11 Es => 3.3166247903554"
## [1] "La raiz cuadrada de 14 Es => 3.74165738677394"
## [1] "La raiz cuadrada de 6 Es => 2.44948974278318"
## [1] "La raiz cuadrada de 1 Es => 1"
## [1] "La raiz cuadrada de 2 Es => 1.4142135623731"
## [1] "La raiz cuadrada de 10 Es => 3.16227766016838"
## [1] "La raiz cuadrada de 3 Es => 1.73205080756888"
## [1] "La raiz cuadrada de 13 Es => 3.60555127546399"
## [1] "La raiz cuadrada de 9 Es => 3"
## [1] "La raiz cuadrada de 4 Es => 2"
## [1] "La raiz cuadrada de 7 Es => 2.64575131106459"
## [1] "La raiz cuadrada de 12 Es => 3.46410161513775"
Esta función calcula el valor exponencial de un número o un vector numérico.
# Evaluamos un valor del pero por medio de un:
message("\n")
##
exp(0)
## [1] 1
exp(seq(2,10,2))
## [1] 7.389056 54.598150 403.428793 2980.957987 22026.465795
Estas son funciones (Cos(x), Sin(x), Tan(x)) de trigonometría implementadas en R aquí.
# Definimos los angulos nobles:
message("\n# Definimos los angulos nobles:")
##
## # Definimos los angulos nobles:
notable <- c(pi/6,pi/4, pi/3,pi/2,0)
print(notable)
## [1] 0.5235988 0.7853982 1.0471976 1.5707963 0.0000000
# iteramos los valores:
message("\n# iteramos los valores:")
##
## # iteramos los valores:
for (x in notable) {
print(paste("Coseno de",x, "=>", cos(t), "Seno de",x, "=>", sin(t), "Tangente de", x, "=>", tan(x)))
cat("\n")
}
## [1] "Coseno de 0.523598775598299 => 0.843853958732492 Seno de 0.523598775598299 => -0.536572918000435 Tangente de 0.523598775598299 => 0.577350269189626"
##
## [1] "Coseno de 0.785398163397448 => 0.843853958732492 Seno de 0.785398163397448 => -0.536572918000435 Tangente de 0.785398163397448 => 1"
##
## [1] "Coseno de 1.0471975511966 => 0.843853958732492 Seno de 1.0471975511966 => -0.536572918000435 Tangente de 1.0471975511966 => 1.73205080756888"
##
## [1] "Coseno de 1.5707963267949 => 0.843853958732492 Seno de 1.5707963267949 => -0.536572918000435 Tangente de 1.5707963267949 => 16331239353195370"
##
## [1] "Coseno de 0 => 0.843853958732492 Seno de 0 => -0.536572918000435 Tangente de 0 => 0"