Reduce
Fait partie de la section Logique et flux d’exécution du Journey R de Coddy. Leçon 35 sur 64.
Reduce(f, x) combine les éléments de x en une seule valeur : il appelle f sur les deux premiers éléments, puis sur ce résultat et le troisième élément, et ainsi de suite. Avec +, il additionne tout :
print(Reduce(function(acc, x) acc + x, c(3, 5, 10)))
print(Reduce(`+`, 1:5))Sortie :
[1] 18
[1] 15Les opérateurs tels que + sont également des fonctions. Écrit entre accents graves, `+` peut être transmis comme n’importe quelle autre fonction. Reduce() est particulièrement utile lorsqu’il n’existe aucune fonction intégrée pour effectuer la combinaison, par exemple pour conserver le plus long de deux mots :
longer <- function(a, b) if (nchar(b) > nchar(a)) b else a
print(Reduce(longer, c("fig", "banana", "kiwi", "cherry")))Résultat :
[1] "banana"Le troisième argument, init, est la valeur de départ. Il est utilisé comme premier acc, et c’est également le résultat lorsque x est vide :
print(Reduce(`+`, c(), 0))
print(Reduce(function(acc, w) paste0(acc, toupper(substr(w, 1, 1))), c("portable", "network", "graphics"), ""))Sortie :
[1] 0
[1] "PNG"accumulate = TRUE renvoie chaque résultat intermédiaire au lieu du dernier uniquement, ce qui donne des totaux cumulés :
deposits <- c(100, -30, 50, -80)
print(Reduce(`+`, deposits, accumulate = TRUE))Sortie :
[1] 100 70 120 40Défi
FacileComplétez running_balance(start, changes). En partant de start, appliquez chaque changement dans l’ordre. Retournez une ligne par changement avec le solde après celui-ci, after 1: 70, puis une dernière ligne lowest: suivie du solde le plus bas atteint (y compris start).
Le code fourni lit le solde de départ et les changements sous forme d’une ligne séparée par des virgules, puis affiche chaque ligne retournée.
Essayez vous-même
running_balance <- function(start, changes) {
# Écrivez votre code ici
character(0)
}
# Code d'entrée/sortie fourni : conservez-le tel quel
input <- suppressWarnings(readLines(file("stdin")))
cat(running_balance(as.numeric(input[1]), as.numeric(strsplit(input[2], ",")[[1]])), sep = "\n")
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
1Les chaînes en profondeur
Sous-chaînes avec substr()Mise en forme avec sprintf()Scinder et joindreRechercher dans les chaînesRemplacer du texteRécapitulatif - Créateur de nom d'utilisateur4Matrices
Créer des matricesIndexer des matricesRécapitulatifs des lignes et des colonnesArithmétique matricielleRécapitulatif - Plan de salle7La famille Apply
lapply et sapplyMap et mapplyFilter et FindReduceRécapitulatif - Pipeline de données10Structures de contrôle avancées
La fonction switch()ifelse() vectorisérepeat et breakFonctions récursivesRécapitulatif – Classificateur de notes2Recherches par clé-valeur
Recherches dans des vecteurs nommésVérifier les clésAjouter et supprimer des clésParcourir les nomsRécapitulatif - Bureau des stocks5Projet - Carnet de notes
Ajouter des élèvesEnregistrer les notes3Ensembles et comptage
Valeurs uniquesOpérations sur les ensemblesTests d’appartenanceCompter avec table()Récapitulatif - Invités à l’événement6Les fonctions comme valeurs
Fonctions anonymesPasser des fonctionsRetourner des fonctionsFermetures avec étatRécapitulatif - Règles de remise9Data Frames
Créer des Data FramesColonnes et lignesFiltrer les lignesAjouter et trierRécapitulatif - Rapport des ventes12Projet - Suivi des dépenses
Enregistrer les dépensesDépenses totalesEntraînez-vous par vous-même : Compilateur R en ligne