5.3 Operadores de función

Los operadores de función son funciones que toman como entrada una función y devuelven como resultado otra función generada como una modificación de la inicial. Esto es diferente de lo mostrado hasta el momento, donde una función usualmente genera un objeto como resultado.

Ejemplo 5.20 Veamos un ejemplo sobre la identificación de números primos. La forma más sencilla de hacer es creando una función que identifique si un número dado es primo o no. El proceso de idear esta función comienza con crear una función que identifique si un número es primo o no. Esta función inicial debe ser pensada como una función que se le puede aplicar a un solo elemento, no a un conjunto de datos.

### Crear la función primo.logic() para identificar números primos
primo.logic <- function(x) {
  if (x == 2) {
    TRUE
  } else if (any(x %% 2:(x-1) == 0)) {
    FALSE
  } else { 
    TRUE
  }
}

### Probar la función con los números primos 2, 3, 5, y no primos 4, 9, 27
primo.logic(2)
# [1] TRUE
primo.logic(3)
# [1] TRUE
primo.logic(5)
# [1] TRUE
primo.logic(4)
# [1] FALSE
primo.logic(9)
# [1] FALSE
primo.logic(27)
# [1] FALSE

El resultado es excelente, primo.logic() identifica si un número es primo o no. Sin embargo, no es eficiente ir probando elemento a elemento el contenido de un conjunto de datos. Automatizar primo.logic() para que aplique la búsqueda de números primos elemento a elemento (element-wise) a un vector completo, implica vectorizar primo.logic() usando la función Vectorize(). Este es el operador de funciones que nos devolverá como resultado la función primo.logic() aplicable a un vector:

### Crear un vector para buscar los números primos en él
sec <- 1:100

### Vectorizar la función primo.logic() y 
### guardarla como una nueva función primoV
primoV <- Vectorize(primo.logic) 

### Usar primoV()
primoV(sec)
#   [1] FALSE  TRUE  TRUE FALSE  TRUE FALSE  TRUE FALSE FALSE FALSE  TRUE FALSE  TRUE
#  [14] FALSE FALSE FALSE  TRUE FALSE  TRUE FALSE FALSE FALSE  TRUE FALSE FALSE FALSE
#  [27] FALSE FALSE  TRUE FALSE  TRUE FALSE FALSE FALSE FALSE FALSE  TRUE FALSE FALSE
#  [40] FALSE  TRUE FALSE  TRUE FALSE FALSE FALSE  TRUE FALSE FALSE FALSE FALSE FALSE
#  [53]  TRUE FALSE FALSE FALSE FALSE FALSE  TRUE FALSE  TRUE FALSE FALSE FALSE FALSE
#  [66] FALSE  TRUE FALSE FALSE FALSE  TRUE FALSE  TRUE FALSE FALSE FALSE FALSE FALSE
#  [79]  TRUE FALSE FALSE FALSE  TRUE FALSE FALSE FALSE FALSE FALSE  TRUE FALSE FALSE
#  [92] FALSE FALSE FALSE FALSE FALSE  TRUE FALSE FALSE FALSE

### Filtrar los números primos de la secuencia
sec[primoV(sec)]
#  [1]  2  3  5  7 11 13 17 19 23 29 31 37 41 43 47 53 59 61 67 71 73 79 83 89 97

De manera similar a lo mostrado con Vectorize(), existen otros enfoques en R que utilizan funciones de la familia apply(). Este tema es abordado en la siguiente sección.