HOWTO · R
Appliquer la fonction avec des arguments multiples en R
Ce tutoriel montre comment appliquer une fonction avec des arguments multiples dans R
Sur cette page
Pour appliquer une fonction R qui prend plusieurs arguments, transmettez les valeurs fixes après la fonction dans apply() ou lapply(), et passez des vecteurs de valeurs correspondantes à mapply() ou Map(). Choisissez la fonction selon la forme des données d’entrée et selon que vous avez besoin d’une liste ou d’un résultat simplifié.
Transmettre des arguments supplémentaires aux fonctions apply
apply(X, MARGIN, FUN, ...) applique FUN à des tranches d’un tableau. Pour une matrice, MARGIN = 1 sélectionne les lignes et MARGIN = 2 sélectionne les colonnes. Les arguments placés après FUN sont transmis à cette fonction : ils peuvent donc rester fixes tandis que la tranche change. Le même principe s’applique à lapply(X, FUN, ...), qui appelle FUN une fois pour chaque élément d’une liste et renvoie toujours une liste. sapply() suit le même modèle, élément par élément, mais tente de simplifier le résultat de type liste en vecteur ou en matrice lorsque c’est possible ; elle n’est pas intrinsèquement plus rapide.
Exécutez cet exemple :
Le code et les libellés ou sorties affichés dans cette section restent en anglais.
scores <- matrix(1:6, nrow = 2)
row_totals <- apply(scores, MARGIN = 1, FUN = function(row, scale, offset) {
sum(row * scale + offset)
}, scale = 2, offset = 1)
print(row_totals)
[1] 21 27
La fonction reçoit chaque ligne dans row, tandis que scale et offset restent fixés à 2 et 1. apply() est conçue pour les tableaux ; appliquée à un bloc de données, elle peut convertir les colonnes vers un type commun. Utilisez lapply() ou Map() lorsque vous devez préserver les éléments d’une liste et leurs types.
Utiliser mapply avec des arguments parallèles
Utilisez mapply(FUN, ..., MoreArgs = NULL, SIMPLIFY = TRUE) lorsque chaque appel doit recevoir les valeurs situées aux positions correspondantes de plusieurs entrées. Contrairement à apply(), cette fonction ne sélectionne pas de marges d’une matrice. Les valeurs transmises par MoreArgs restent fixes à chaque appel ; celles fournies par ... varient d’un appel à l’autre. Par défaut, mapply() tente de simplifier son résultat, comme sapply().
Le code et les libellés ou sorties affichés dans cette section restent en anglais.
add_with_tax <- function(price, tax, rate) price * (1 + rate) + tax
prices <- c(10, 20, 30)
fees <- c(1, 2, 3)
totals <- mapply(add_with_tax, prices, fees, MoreArgs = list(rate = 0.1))
print(totals)
[1] 12 24 36
Ici, chaque prix est associé aux frais situés à la même position, tandis que le taux de taxe reste fixe. Lorsque les longueurs diffèrent, mapply() recycle les entrées selon les règles de recyclage des vecteurs de R ; utilisez des entrées de même longueur si chaque élément doit avoir un partenaire unique. Définissez SIMPLIFY = FALSE si vous préférez obtenir une liste.
Utiliser Map lorsqu’un résultat sous forme de liste est nécessaire
Map(FUN, ...) applique FUN aux éléments correspondants de ses entrées et renvoie une liste. Cette fonction équivaut à utiliser mapply() avec la simplification désactivée. Elle convient donc lorsque chaque appel renvoie un objet qui doit rester un élément distinct de la liste.
Le code et les libellés ou sorties affichés dans cette section restent en anglais.
combine <- function(values, multiplier) values * multiplier
parts <- list(first = 1:2, second = 3:4)
scaled <- Map(combine, parts, c(10, 100))
print(scaled)
$first
[1] 10 20
$second
[1] 300 400
Chaque élément de la liste est transmis avec le multiplicateur correspondant. La fonction renvoie une liste même si ses éléments pourraient être regroupés dans un vecteur ou une matrice. Comme mapply(), Map() recycle les entrées les plus courtes : vérifiez donc leurs longueurs si l’association par position est importante.
Choisir la bonne fonction de la famille apply
- Utilisez
apply()pour traiter les lignes ou les colonnes d’une matrice ou d’un autre tableau, en transmettant les arguments supplémentaires fixes aprèsFUN. - Utilisez
lapply()avec une entrée de type liste lorsque le résultat doit toujours rester une liste ; choisissezsapply()si la simplification éventuelle vous est utile et que la forme obtenue convient. - Utilisez
mapply()avec plusieurs entrées dont les éléments correspondants deviennent les arguments de chaque appel de fonction. DéfinissezSIMPLIFY = FALSEsi le résultat doit être une liste. - Utilisez
Map()pour appliquer le même principe aux entrées parallèles lorsque vous voulez obtenir une liste par défaut.
Dans les quatre cas, les arguments ordinaires de la fonction appliquée viennent en premier. Nommez les valeurs fixes lorsque cela permet de mieux comprendre leur rôle. Avec mapply() et Map(), vérifiez que le recyclage correspond aux associations voulues. Avec apply(), gardez à l’esprit qu’un bloc de données peut être converti avant le traitement de ses lignes ou de ses colonnes. Ces différences sont plus utiles pour choisir une fonction qu’une affirmation générale sur la vitesse.