Devolver funciones
Parte de la sección Lógica y flujo del Journey de R de Coddy. Lección 29 de 64.
Una función también puede devolver una función. make_multiplier(3) devuelve una nueva función que multiplica su argumento por 3:
make_multiplier <- function(n) {
function(x) x * n
}
triple <- make_multiplier(3)
print(triple(5))
print(make_multiplier(10)(5))Salida:
[1] 15
[1] 50La función devuelta recuerda los valores con los que se construyó. Esta combinación de una función y las variables que la rodean se denomina clausura. Cada llamada a la creadora construye una clausura independiente:
make_greeter <- function(greeting) {
function(name) paste0(greeting, ", ", name, "!")
}
hello <- make_greeter("Hello")
hola <- make_greeter("Hola")
print(hello("Ada"))
print(hola("Ada"))Salida:
[1] "Hello, Ada!"
[1] "Hola, Ada!"Una función creadora convierte unos pocos ajustes en una herramienta lista para usar, por ejemplo, un convertidor entre unidades:
make_converter <- function(factor, offset = 0) {
function(x) x * factor + offset
}
c_to_f <- make_converter(1.8, 32)
km_to_miles <- make_converter(0.621)
print(c_to_f(100))
print(km_to_miles(10))Salida:
[1] 212
[1] 6.21Las funciones se pueden combinar para crear nuevas funciones. compose(f, g) devuelve una función que ejecuta f y después g:
compose <- function(f, g) function(x) g(f(x))
clean <- compose(trimws, toupper)
print(clean(" hi there "))Salida:
[1] "HI THERE"Desafío
FácilCompleta make_formatter(prefix, digits). Devuelve una función que toma un número y devuelve prefix seguido del número con digits decimales: make_formatter("$", 2)(3.5) devuelve $3.50.
sprintf("%.*f", digits, x) formatea x con digits decimales.
El código proporcionado lee el prefijo, el número de decimales y una lista de números separados por comas. Crea un formateador y muestra su resultado para cada número.
Pruébalo tú mismo
make_formatter <- function(prefix, digits) {
# Escribe tu código aquí
function(x) ""
}
# Código de entrada/salida suministrado: déjalo como está
input <- suppressWarnings(readLines(file("stdin")))
fmt <- make_formatter(input[1], as.integer(input[2]))
for (x in as.numeric(strsplit(input[3], ",")[[1]])) cat(fmt(x), "\n", sep = "")
Esta lección incluye un breve cuestionario. Empieza la lección para responderlo y registrar tu progreso.
Todas las lecciones de Lógica y flujo
1Cadenas a fondo
Subcadenas con substr()Formateo con sprintf()Dividir y unirBuscar cadenasReemplazar textoRepaso - Constructor de nombres de usuario4Matrices
Creación de matricesIndexación de matricesResúmenes de filas y columnasAritmética de matricesRepaso: tabla de asientos2Búsquedas clave-valor
Búsquedas en vectores con nombreComprobar clavesAñadir y eliminar clavesRecorrer nombresRepaso: panel bursátil5Proyecto - Libro de calificaciones
Añadir estudiantesRegistrar calificaciones3Conjuntos y conteo
Valores únicosOperaciones con conjuntosPruebas de pertenenciaConteo con table()Repaso: invitados al evento6Funciones como valores
Funciones anónimasPasar funcionesDevolver funcionesClausuras con estadoRepaso: reglas de descuento9Marcos de datos
Creación de marcos de datosColumnas y filasFiltrado de filasAdición y ordenaciónRepaso - Informe de ventas12Proyecto: Rastreador de gastos
Registro de gastosGasto totalPractica por tu cuenta: Compilador de R online