Passer des fonctions
Fait partie de la section Logique et flux d’exécution du Journey R de Coddy. Leçon 28 sur 64.
Une fonction peut prendre une autre fonction comme argument et l’appeler. apply_twice() ci-dessous fonctionne avec toute fonction à un argument :
apply_twice <- function(f, x) f(f(x))
print(apply_twice(\(x) x + 3, 10))
print(apply_twice(toupper, "ok"))Sortie :
[1] 16
[1] "OK"Les fonctions intégrées telles que sum, max ou toupper sont également des valeurs ; passez-les donc par leur nom, sans parenthèses. Avec des parenthèses, elles seraient appelées à la place :
summarize <- function(xs, how) how(xs)
print(summarize(c(4, 9, 2), max))
print(summarize(c(4, 9, 2), sum))Sortie :
[1] 9
[1] 15Une fonction qui prend un prédicat, une fonction renvoyant TRUE ou FALSE, peut compter ou sélectionner des valeurs selon n’importe quelle règle :
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))Sortie :
[1] 2
[1] 3L’appelant détermine le comportement et la fonction fournit la boucle, de sorte qu’une seule fonction couvre de nombreux cas :
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))Sortie :
[1] 10 20 30 40
[1] "A" "B"Défi
FacileComplétez apply_n(f, x, n). Appelez f sur x, puis sur le résultat, n fois au total, et renvoyez la valeur finale. Lorsque n vaut 0, renvoyez x sans modification.
Le code fourni définit trois fonctions, double, inc et half. Il lit le nom de l’une d’elles, la valeur de départ et n, puis affiche le résultat de apply_n().
Essayez vous-même
apply_n <- function(f, x, n) {
# Écrivez votre code ici
x
}
# Code d'entrée/sortie fourni : gardez-le tel quel
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")
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