Map y mapply
Parte de la sección Lógica y flujo del Journey de R de Coddy. Lección 33 de 64.
Map(f, xs, ys) recorre dos o más vectores paso a paso y llama a f con un elemento de cada uno: primero con los primeros elementos, después con los segundos elementos, y así sucesivamente. Devuelve una lista:
totals <- Map(function(q, p) q * p, c(2, 1, 3), c(4, 12, 2.5))
print(length(totals))
print(totals[[3]])Salida:
[1] 3
[1] 7.5mapply() es la versión simplificada, como sapply() para varios vectores. unlist() también aplana la lista de Map() en un vector:
print(mapply(function(q, p) q * p, c(2, 1, 3), c(4, 12, 2.5)))
print(unlist(Map(function(a, b) a + b, 1:3, 4:6)))Salida:
[1] 8.0 12.0 7.5
[1] 5 7 9Los vectores se emparejan por posición, por lo que deben tener la misma longitud. mapply() asigna nombres a los resultados de texto después del primer vector; USE.NAMES = FALSE elimina los nombres:
items <- c("tea", "jam")
qty <- c(2, 3)
labels <- mapply(function(i, q) paste(q, "x", i), items, qty, USE.NAMES = FALSE)
print(labels)Salida:
[1] "2 x tea" "3 x jam"Cuando cada par necesita un if, escribe una función con varios argumentos y pásala a mapply(). La condición se ejecuta después una vez por cada par:
describe <- function(name, age) {
group <- if (age < 18) "minor" else "adult"
paste0(name, " (", group, ")")
}
print(mapply(describe, c("Ada", "Tim"), c(36, 12), USE.NAMES = FALSE))Salida:
[1] "Ada (adult)" "Tim (minor)"Desafío
FácilCompleta order_lines(items, qty, prices). Devuelve una línea por artículo, 2 x tea = 8.00: la cantidad, x , el artículo, = y la cantidad multiplicada por el precio con dos decimales. Usa mapply() o Map().
El código proporcionado lee los artículos, las cantidades y los precios como tres líneas separadas por comas e imprime cada línea devuelta.
Pruébalo tú mismo
order_lines <- function(items, qty, prices) {
# Escribe tu código aquí
character(0)
}
# Código de entrada/salida suministrado: mantenlo tal como está
input <- suppressWarnings(readLines(file("stdin")))
cat(order_lines(strsplit(input[1], ",")[[1]], as.numeric(strsplit(input[2], ",")[[1]]), as.numeric(strsplit(input[3], ",")[[1]])), 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