x<-1+2:3*(4/5)Air : un peu d’air frais dans votre code R
R, Air, formatter, Posit, style de code
Air : un peu d’air frais dans votre code R
Fini les débats sur l’indentation et les espaces, laissez la machine s’en charger.
Vous avez déjà perdu du temps à débattre d’indentation ou d’espaces autour d’un opérateur en relisant du code écrit par quelqu’un d’autre ? Je vous présente Air, un formatteur pour R développé par l’équipe Posit.
Un formatteur, à quoi ça sert ?
Un formatteur, c’est un outil qui réécrit automatiquement votre code pour qu’il respecte des règles de mise en forme cohérentes : indentation, espaces autour des opérateurs, longueur des lignes, retours à la ligne… Le tout sans jamais toucher à ce que le code fait.
À titre personnel, je suis un peu maniaque de la typographie (espaces insécables, guillemets français, ce genre de détails), et quand je code c’est un peu pareil : j’aime que les choses soient bien faites et agréables à lire. Ceci dit, je ne suis pas infaillible. Là où ça se complique sérieusement, c’est lors de la collaboration sur des projets : je m’arrache les cheveux dès que le code n’est pas mis en forme correctement. C’est dommage, au lieu de se concentrer sur le fond, les discussions ne portent que sur la forme.
Voici un exemple concret : le code ci-dessous est parfaitement valide en R.
Mais pour moi, c’est illisible sans clarifier mentalement la précédence des opérateurs. Avec Air :
x <- 1 + 2:3 * (4 / 5)Le résultat est exactement le même, mais on comprend tout de suite l’ordre des opérations effectuées. C’est tout l’intérêt d’un formatteur : on peut se permettre d’écrire en se concentrant sur de fond, sans se soucier de la forme, l’outil s’en charge après coup.
Air en action
Air est un formatteur développé par l’équipe Posit. Codé en Rust, il est extrêmement rapide et capable de formater un projet entier en quelques millisecondes. Il se base principalement sur le tidyverse style guide (que je vous recommande vivement !), avec très peu d’options de configuration : le type d’indentation, sa taille et la longueur maximale de ligne.
Air a aussi son mot à dire sur la façon d’assigner une valeur : par défaut, il convertit les = d’assignation en <-.
# Avant
x = 1
# Après
x <- 1En temps normal, c’est Air qui décide seul où placer les retours à la ligne : si un appel de fonction tient sur une seule ligne sans dépasser la longueur autorisée, il le remet à plat, peu importe la façon dont vous l’aviez écrit au départ.
Toutefois, il existe quelques endroits précis où Air considère qu’un retour à la ligne est une intention délibérée de votre part, et le conserve ! C’est ce qu’on appelle un retour à la ligne persistant. Dans l’exemple ci-dessous, un retour à la ligne est inséré juste après la parenthèse ouvrante d’un appel de fonction, avant le premier argument.
poissons <- list(
daurade = 0.75,
bonite = 0.25
)Même si cette liste tiendrait facilement sur une seule ligne, Air ne la recompactera pas tout seul : le retour à la ligne après list( est persistant. Pour revenir à une version compacte, il faut recoller la première ligne soi-même. L’idée : Air garde la main sur la mise en page dans l’immense majorité des cas, mais reconnaît qu’on sait parfois mieux que lui quand une présentation étalée améliore la lecture !
Autre fonctionnalité pratique, l’autobracing : Air ajoute automatiquement des accolades { } autour du corps d’un if, d’une boucle ou d’une fonction quand elles manquent et que leur absence peut poser problème.
# Avant
if (condition) a else if (condition2) b else c
# Après
if (condition) {
a
} else if (condition2) {
b
} else {
c
}Ce changement n’est pas juste esthétique : un if multiligne sans accolades peut casser si vous copiez-collez ce bout de code hors de son contexte d’origine, avec une erreur du type unexpected 'else'. Les accolades rendent le code portable.
Comment l’utiliser
Air s’intègre dans les principaux environnements de développement R :
airdirectement, y compris dans des pipelines d’intégration continue.Pour un projet partagé avec d’autres personnes, mieux vaut créer un fichier
air.toml(voir exemple ci-dessous) à la racine, même avec les réglages par défaut. Il fixe les règles pour tout le monde et évite que Air ne se base sur les préférences propres à l’éditeur de chacun.Une fois configuré, plus besoin d’y penser : le code se formate tout seul à chaque sauvegarde, les discussions peuvent se concentrer sur ce qui compte vraiment !
Aérez-vous l’esprit, passez à Air !
Découvrir les formations
Me contacter