Menu
Coddy logo textTech

Map et mapply

Fait partie de la section Logique et flux d’exécution du Journey R de Coddy. Leçon 33 sur 64.

Map(f, xs, ys) parcourt deux vecteurs ou plus simultanément et appelle f avec un élément de chacun d’eux : d’abord avec les premiers éléments, puis avec les deuxièmes éléments, et ainsi de suite. Elle renvoie une liste :

totals <- Map(function(q, p) q * p, c(2, 1, 3), c(4, 12, 2.5))
print(length(totals))
print(totals[[3]])

Sortie :

[1] 3
[1] 7.5

mapply() est la version simplifiée, comme sapply() pour plusieurs vecteurs. unlist() aplatit également la liste issue de Map() en un vecteur :

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)))

Sortie :

[1]  8.0 12.0  7.5
[1] 5 7 9

Les vecteurs sont associés par position, ils doivent donc avoir la même longueur. mapply() nomme les résultats textuels d’après le premier vecteur ; USE.NAMES = FALSE supprime les noms :

items <- c("tea", "jam")
qty <- c(2, 3)
labels <- mapply(function(i, q) paste(q, "x", i), items, qty, USE.NAMES = FALSE)
print(labels)

Sortie :

[1] "2 x tea" "3 x jam"

Lorsque chaque paire nécessite un if, écrivez une fonction avec plusieurs arguments et transmettez-la à mapply(). La condition s’exécute alors une fois par paire :

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))

Sortie :

[1] "Ada (adult)" "Tim (minor)"
challenge icon

Défi

Facile

Complétez order_lines(items, qty, prices). Renvoyez une ligne par article, 2 x tea = 8.00 : la quantité, x , l’article, = et la quantité multipliée par le prix avec deux décimales. Utilisez mapply() ou Map().

Le code fourni lit les articles, les quantités et les prix sous forme de trois lignes séparées par des virgules, puis affiche chaque ligne renvoyée.

Essayez vous-même

order_lines <- function(items, qty, prices) {
  # Écrivez votre code ici
  character(0)
}

# Code d'entrée/sortie fourni : gardez-le tel quel
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")
quiz iconTestez-vous

Cette leçon comprend un petit quiz. Commencez la leçon pour y répondre et suivre votre progression.

Toutes les leçons de Logique et flux d’exécution

Entraînez-vous par vous-même : Compilateur R en ligne