Menu
Coddy logo textTech

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] 15

Une 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] 3

L’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"
challenge icon

Défi

Facile

Complé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")
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