Menu
Coddy logo textTech

Retourner des fonctions

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

Une fonction peut également renvoyer une fonction. make_multiplier(3) renvoie une nouvelle fonction qui multiplie son argument par 3 :

make_multiplier <- function(n) {
  function(x) x * n
}
triple <- make_multiplier(3)
print(triple(5))
print(make_multiplier(10)(5))

Résultat :

[1] 15
[1] 50

La fonction renvoyée se souvient des valeurs avec lesquelles elle a été créée. Cette combinaison d’une fonction et des variables qui l’entourent s’appelle une fermeture. Chaque appel de la fabrique crée une fermeture distincte :

make_greeter <- function(greeting) {
  function(name) paste0(greeting, ", ", name, "!")
}
hello <- make_greeter("Hello")
hola <- make_greeter("Hola")
print(hello("Ada"))
print(hola("Ada"))

Sortie :

[1] "Hello, Ada!"
[1] "Hola, Ada!"

Une fonction de création transforme quelques paramètres en un outil prêt à l’emploi, par exemple un convertisseur entre unités :

make_converter <- function(factor, offset = 0) {
  function(x) x * factor + offset
}
c_to_f <- make_converter(1.8, 32)
km_to_miles <- make_converter(0.621)
print(c_to_f(100))
print(km_to_miles(10))

Sortie :

[1] 212
[1] 6.21

Les fonctions peuvent être combinées pour créer de nouvelles fonctions. compose(f, g) renvoie une fonction qui exécute f, puis g :

compose <- function(f, g) function(x) g(f(x))
clean <- compose(trimws, toupper)
print(clean("  hi there "))

Résultat :

[1] "HI THERE"
challenge icon

Défi

Facile

Complétez make_formatter(prefix, digits). Elle renvoie une fonction qui prend un nombre et renvoie prefix suivi du nombre avec digits décimales : make_formatter("$", 2)(3.5) renvoie $3.50.

sprintf("%.*f", digits, x) formate x avec digits décimales.

Le code fourni lit le préfixe, le nombre de décimales et une liste de nombres séparés par des virgules. Il construit un formateur et affiche son résultat pour chaque nombre.

Essayez vous-même

make_formatter <- function(prefix, digits) {
  # Écrivez votre code ici
  function(x) ""
}

# Code d'entrée/sortie fourni : gardez-le tel quel
input <- suppressWarnings(readLines(file("stdin")))
fmt <- make_formatter(input[1], as.integer(input[2]))
for (x in as.numeric(strsplit(input[3], ",")[[1]])) cat(fmt(x), "\n", sep = "")
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