Chapter 9 Funciones en R

Las funciones definidas por el usuario en R son bloques de código que realizan una tarea específica y se pueden llamar desde cualquier lugar del programa. Las funciones en R se definen usando la palabra clave function seguida del nombre de la función, paréntesis y llaves.

Las funciones toman argumentos de entrada y producen un resultado como salida. Las funciones definidas por el usuario son una herramienta poderosa en R que permiten reutilizar código y automatizar tareas. Una vez que domines la sintaxis básica de la función en R, puedes comenzar a crear funciones más avanzadas y complejas para adaptarse a tus necesidades.

9.1 Sintaxis básica de una función en R

La sintaxis básica para definir una función en R es la siguiente:

nombre_de_la_funcion <- function(arg1, arg2, ...) {
  # Cuerpo de la función
  resultado <- ...
  return(resultado)
}

Donde:

  • nombre_de_la_funcion: el nombre que le das a tu función. -function: la palabra function
  • arg1, arg2, …: los argumentos de entrada que toma la función (opcional).
  • resultado: el resultado que devuelve la función (opcional).

El cuerpo de la función es donde se escribe el código que realiza la tarea específica. El resultado de la función se devuelve con la función return().

9.2 Ejemplo de función definida por el usuario en R

Aquí hay un ejemplo de una función definida por el usuario que toma dos argumentos x e y y devuelve la suma de ambos:

mi_suma <- function(x, y) {
  resultado <- x + y
  return(resultado)
}

Para usar esta función, simplemente llámala con los argumentos que deseas pasar:

mi_suma(3, 5)
## [1] 8

9.3 Ejemplo de función con argumentos por defecto en R

Las funciones en R también pueden tener argumentos por defecto que se utilizan si no se proporciona ningún valor para ellos. Aquí hay un ejemplo de una función que tiene dos argumentos, x e y, y y tiene un valor por defecto de 2:

mi_funcion <- function(x, y = 2) {
  resultado <- x * y
  return(resultado)
}

En este caso, si no se proporciona un valor para y, se utilizará el valor por defecto de 2:

mi_funcion(3)
## [1] 6

También puede proporcionar un valor diferente para y, si es necesario:

mi_funcion(3, 5)
## [1] 15

9.4 Definir una función con un parámetro opcional

saludar <- function(nombre, saludo = "Hola") {
  mensaje <- paste(saludo, nombre)
  return(mensaje)
}

9.4.1 Llamar a la función saludar sin proporcionar el parámetro opcional

mensaje1 <- saludar("Juan")
print(mensaje1)
## [1] "Hola Juan"

9.4.2 Llamar a la función saludar proporcionando el parámetro opcional

mensaje2 <- saludar("María", "Buenos días")
print(mensaje2)
## [1] "Buenos días María"

9.5 Definir una función para calcular el área de un círculo

area_circulo <- function(radio) {
  area <- pi * radio^2
  return(area)
}
# Ejemplo de uso

radio <- 3
area <- area_circulo(radio)
print(paste("El área del círculo con radio", radio, "es:", area))
## [1] "El área del círculo con radio 3 es: 28.2743338823081"

9.6 Definir una función para calcular el factorial de un número

factorial <- function(n) {
  if (n == 0) {
    return(1)
  } else {
    return(n * factorial(n - 1))
  }
}

# Ejemplo de uso
numero <- 5
resultado <- factorial(numero)
print(paste("El factorial de", numero, "es:", resultado))
## [1] "El factorial de 5 es: 120"

9.7 Definir una función para verificar si un número es primo

es_primo <- function(n) {
  if (n <= 1) {
    return(FALSE)
  } else if (n <= 3) {
    return(TRUE)
  } else if (n %% 2 == 0 | n %% 3 == 0) {
    return(FALSE)
  }
  i <- 5
  while (i * i <= n) {
    if (n %% i == 0 | n %% (i + 2) == 0) {
      return(FALSE)
    }
    i <- i + 6
  }
  return(TRUE)
}

# Ejemplo de uso
numero <- 11
if (es_primo(numero)) {
  print(paste(numero, "es un número primo."))
} else {
  print(paste(numero, "no es un número primo."))
}
## [1] "11 es un número primo."

9.7.1 Ejemplo resuelto

Calcular Índice de Diversidad de Shannon

Descripción: Define una función que calcule el índice de diversidad de Shannon dado un vector de abundancias de especies.

  • Define una función indice_shannon que acepte un argumento: abundancias.
  • La función debe devolver el índice de Shannon calculado a partir del vector de abundancias.
indice_shannon <- function(abundancias) {
  p <- abundancias / sum(abundancias)
  shannon <- -sum(p * log(p), na.rm = TRUE)
  return(shannon)
}

# Prueba de la función
indice_shannon(c(10, 20, 30, 40))
## [1] 1.279854

Calcular Matriz de Distancias Genéticas

Descripción: Define una función que calcule una matriz de distancias genéticas entre varias secuencias.

  • Define una función matriz_distancias que acepte un argumento: secuencias (una lista de secuencias).
  • La función debe devolver una matriz de distancias (número de diferencias entre pares de secuencias).
matriz_distancias <- function(secuencias) {
  n <- length(secuencias)
  distancias <- matrix(0, n, n)
  for (i in 1:(n-1)) {
    for (j in (i+1):n) {
      distancias[i, j] <- sum(secuencias[[i]] != secuencias[[j]])
      distancias[j, i] <- distancias[i, j]
    }
  }
  return(distancias)
}

# Prueba de la función
matriz_distancias(list(c("A", "T", "G", "C"), c("A", "T", "A", "C"), c("G", "C", "G", "C")))
##      [,1] [,2] [,3]
## [1,]    0    1    2
## [2,]    1    0    3
## [3,]    2    3    0

Ejercicios

  1. Escribe una función que tome un vector numérico como argumento de entrada y devuelva la media aritmética de los valores.

  2. Escribe una función que tome dos vectores numéricos como argumentos de entrada y devuelva su producto punto (también conocido como producto escalar).

  3. Escribe una función que tome un vector numérico como argumento de entrada y devuelva el valor mínimo y máximo en una lista.

  4. Escribe una función que tome una matriz cuadrada como argumento de entrada y devuelva su determinante.

  5. Escribe una función que tome una matriz de \(2 \times 2\) como argumento de entrada y devuelva su transpuesta.

  6. Escribe una función que tome una lista como argumento de entrada y devuelva la longitud de cada elemento en una lista.

  7. Escribe una función que tome una cadena de texto como argumento de entrada y devuelva una lista con todas las palabras en la cadena.

  8. Escribe una función que tome un vector numérico como argumento de entrada y devuelva un vector con los valores ordenados de menor a mayor.

  9. Escribe una función que tome un vector de caracteres como argumento de entrada y devuelva un vector con los mismos elementos en orden inverso.

  10. Escribe una función que tome una matriz como argumento de entrada y devuelva la diagonal principal en un vector.

  11. Calcular Tasa de Crecimiento Bacteriano

Descripción: Define una función que calcule la tasa de crecimiento bacteriano dada la concentración inicial y final de bacterias y el tiempo.

  • Define una función tasa_crecimiento que acepte tres argumentos: concentracion_inicial, concentracion_final y tiempo.
  • La función debe devolver la tasa de crecimiento (logaritmo natural de la razón de concentraciones dividido por el tiempo).
  1. Calcular Porcentaje de GC

Descripción: Define una función que calcule el porcentaje de GC en una secuencia de ADN.

  • Define una función porcentaje_gc que acepte un argumento: secuencia.
  • La función debe devolver el porcentaje de bases G y C en la secuencia.
  1. Calcular Resistencia Promedio

Descripción: Define una función que calcule la resistencia promedio de una bacteria a varios antibióticos.

  • Define una función resistencia_promedio que acepte un argumento: resistencias (un vector de valores de resistencia).
  • La función debe devolver la resistencia promedio.
  1. Calcular Concentración Normalizada

Descripción: Define una función que normalice un vector de concentraciones de metabolitos.

  • Define una función normalizar_concentraciones que acepte un argumento: concentraciones.
  • La función debe devolver el vector de concentraciones normalizado (dividiendo cada valor por el máximo).
  1. Calcular la Media y Desviación Estándar de Niveles de Expresión

Descripción: Define una función que calcule la media y desviación estándar de los niveles de expresión génica.

  • Define una función estadisticas_expresion que acepte un argumento: niveles.
  • La función debe devolver una lista con la media y la desviación estándar de los niveles de expresión.