Pasar funciones
Parte de la sección Lógica y flujo del Journey de R de Coddy. Lección 28 de 64.
Una función puede tomar otra función como argumento y llamarla. apply_twice() a continuación funciona con cualquier función de un argumento:
apply_twice <- function(f, x) f(f(x))
print(apply_twice(\(x) x + 3, 10))
print(apply_twice(toupper, "ok"))Salida:
[1] 16
[1] "OK"Las funciones integradas, como sum, max o toupper, también son valores, así que pásalas por su nombre sin paréntesis. Con paréntesis, se llamarían en su lugar:
summarize <- function(xs, how) how(xs)
print(summarize(c(4, 9, 2), max))
print(summarize(c(4, 9, 2), sum))Salida:
[1] 9
[1] 15Una función que toma un predicado, una función que devuelve TRUE o FALSE, puede contar o seleccionar valores según cualquier regla:
count_if <- function(xs, keep) {
n <- 0
for (x in xs) if (keep(x)) n <- n + 1
n
}
print(count_if(c(3, 8, 10, 5), \(x) x %% 2 == 0))
print(count_if(c(3, 8, 10, 5), \(x) x > 4))Salida:
[1] 2
[1] 3La persona que llama decide el comportamiento y la función proporciona el bucle, así que una función cubre muchos casos:
transform_each <- function(xs, f) {
out <- c()
for (x in xs) out <- c(out, f(x))
out
}
print(transform_each(1:4, \(x) x * 10))
print(transform_each(c("a", "b"), toupper))Salida:
[1] 10 20 30 40
[1] "A" "B"Desafío
FácilCompleta apply_n(f, x, n). Llama a f sobre x, después sobre el resultado, n veces en total, y devuelve el valor final. Cuando n es 0, devuelve x sin cambios.
El código proporcionado define tres funciones: double, inc y half. Lee el nombre de una de ellas, el valor inicial y n, e imprime el resultado de apply_n().
Pruébalo tú mismo
apply_n <- function(f, x, n) {
# Escribe tu código aquí
x
}
# Código de entrada/salida suministrado: déjalo tal como está
input <- suppressWarnings(readLines(file("stdin")))
ops <- list(double = \(x) x * 2, inc = \(x) x + 1, half = \(x) x / 2)
cat(apply_n(ops[[input[1]]], as.numeric(input[2]), as.numeric(input[3])), sep = "\n")
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