Expressions et affichage automatique
R est un langage d'expressions : presque chaque ligne que vous écrivez produit une valeur. À la console, une expression tapée seule est évaluée et sa valeur affichée automatiquement - pas besoin de print() :
Chaque résultat est préfixé par [1] - c'est R qui vous indique la position de la première valeur affichée, un premier indice que R pense en vecteurs (voir plus bas). L'affichage automatique a un piège à connaître dès le premier jour : il ne concerne que les expressions nues au niveau supérieur. La même expression dans le corps d'une fonction ou d'une boucle for n'affiche rien, c'est pourquoi les scripts utilisent des cat() ou print() explicites pour les sorties que vous devez voir.
L'affectation : la flèche
L'opérateur d'affectation de R est <-, une flèche pointant vers le nom qui reçoit la valeur :
Lisez radius <- 5 comme « radius reçoit 5 ». Oui, = fonctionne aussi pour l'affectation au niveau supérieur, et oui, les nouveaux venus demandent pourquoi taper deux caractères au lieu d'un. La réponse est une convention qui a du mordant : tous les grands guides de style, la documentation de R de base et pratiquement tout le code R que vous lirez utilisent <- pour l'affectation, réservant = à une seule tâche - nommer les arguments dans les appels de fonction (section suivante). Suivre la convention rend les deux opérations visuellement distinctes. Dans RStudio, Alt+- (Option+- sur macOS) tape la flèche pour vous.
Notez qu'une affectation ne s'affiche pas automatiquement - area <- 78.5 stocke la valeur en silence. C'est pourquoi l'exemple ci-dessus a besoin du print().
Sensibilité à la casse
R est strictement sensible à la casse, pour les noms que vous créez comme pour ceux que le langage fournit :
Deux variables différentes. De même, mean() est une fonction et Mean() n'existe pas. Quand R vous accueille avec object 'x' not found ou could not find function, vérifiez les majuscules avant toute autre chose - c'est l'erreur de débutant la plus fréquente.
Appels de fonction et arguments nommés
Les fonctions s'appellent avec des parenthèses, les arguments séparés par des virgules. Les arguments peuvent être associés par position, par nom, ou un mélange des deux :
L'appel à seq() montre la syntaxe des arguments nommés de R - et c'est là que = gagne sa place : dans un appel, name = value étiquette un argument. Les arguments nommés vous libèrent de la mémorisation de l'ordre des paramètres, et ils rendent les appels auto-documentés ; seq(0, 100, 25) fonctionne à l'identique mais en dit moins au lecteur. La convention de travail : passer le premier argument (généralement les données) par position, nommer les autres.
Obtenir de l'aide sur n'importe quelle fonction tient en une frappe : ?seq à la console ouvre sa documentation.
Tout est vecteur
L'idée qui rend R différent des autres langages : il n'existe pas de nombre isolé. Même 5 est un vecteur de longueur un, et les opérations s'appliquent élément par élément à des vecteurs entiers :
Aucune boucle nulle part, et pourtant chaque élément a été converti. Dans la plupart des langages, ce sont trois itérations d'une boucle for ; en R, c'est de l'arithmétique. C'est la vectorisation, et elle façonne tout - les opérateurs de comparaison, les fonctions de chaînes et les fonctions mathématiques travaillent toutes ainsi. C'est pourquoi le R idiomatique a bien moins de boucles qu'on ne s'y attendrait ; l'histoire complète est dans vecteurs.
Accolades et blocs
Les corps multi-lignes - pour if, les boucles et les fonctions - sont regroupés avec des accolades {} :
Deux choses à remarquer. La condition vit entre parenthèses, et c'est un simple if, pas if: ni if ... then. Et contrairement à Python, l'indentation ne porte aucun sens en R - les accolades définissent le bloc, l'indentation est pour les humains. Omettre les accolades sur les instructions d'une ligne est légal mais constitue une source classique de bugs d'édition ; utilisez-les toujours, tout simplement.
Espaces et points-virgules
R ignore les espaces superflus, et un retour à la ligne termine une instruction - aucun point-virgule requis :
La coupure sur deux lignes fonctionne parce que la ligne 3 se termine par +, donc R sait que l'expression n'est pas finie. C'est la seule règle à retenir pour couper les lignes longues : coupez après un opérateur ou une virgule, jamais avant, sinon R considérera la première ligne comme complète. Les points-virgules n'existent que pour tasser deux instructions sur une ligne (a <- 1; b <- 2) - légal, déconseillé, facile à éviter.
Style : comment s'écrit le code R
Au-delà de la grammaire, R a de fortes conventions communautaires (codifiées dans le guide de style du tidyverse, que suit l'essentiel de l'écosystème) :
<-pour l'affectation,=uniquement pour les arguments dans les appels.- Des noms en
snake_case:monthly_revenue, pasmonthlyRevenuenimonthly.revenue. Les points sont légaux dans les noms R mais à éviter - ils entrent en collision avec un schéma de nommage utilisé par les mécanismes internes de R. - Des espaces autour des opérateurs (
x <- a * 2, pasx<-a*2) et après les virgules. - Indentez avec quatre espaces à l'intérieur des accolades (certaines équipes en utilisent deux ; choisissez et restez cohérent).
- Une instruction par ligne.
Rien de tout cela n'est imposé par l'interpréteur. Tout cela est imposé par quiconque lit votre code. La partie nommage de cette histoire continue dans variables.
Ce qu'il faut retenir
- R évalue les expressions et affiche automatiquement celles qui sont nues à la console - mais pas dans les fonctions ni les boucles.
- Affectez avec
<-(« reçoit ») ; utilisez=uniquement pour nommer les arguments des appels de fonction. - R est entièrement sensible à la casse - les fautes de majuscules causent la plupart des premières erreurs « not found ».
- Tout est vecteur, et les opérations s'appliquent élément par élément :
c(1, 2, 3) * 2donne2 4 6, sans boucle. - Les accolades définissent les blocs, les retours à la ligne terminent les instructions, et le
snake_caseplus les conventions d'espacement font que votre code se lit comme celui de tout le monde.
Prochaine étape : les commentaires - comment annoter le code R, et que faire de l'absence de syntaxe de commentaire de bloc en R.
Questions fréquentes
Que signifie <- en R ?
<- est l'opérateur d'affectation de R : x <- 5 stocke la valeur 5 sous le nom x. Lisez-le « reçoit ». = affecte aussi au niveau supérieur, mais la convention de la communauté - imposée par tous les grands guides de style - est <- pour l'affectation et = uniquement pour nommer les arguments dans les appels de fonction.
R est-il sensible à la casse ?
Oui, complètement. total, Total et TOTAL sont trois noms différents, et appeler Mean(x) au lieu de mean(x) est une erreur, pas un avertissement. Une erreur « could not find function » ou « object not found » est très souvent une simple faute de majuscule.
Faut-il des points-virgules en R ?
Non. Un retour à la ligne termine une instruction. Les points-virgules ne servent qu'à tasser deux instructions sur une même ligne (a <- 1; b <- 2), ce que les guides de style déconseillent de toute façon. Écrivez une instruction par ligne et ne pensez plus jamais aux points-virgules.
Que signifie « R est vectorisé » ?
Les opérations de base de R travaillent sur des vecteurs entiers d'un coup. c(1, 2, 3) * 2 donne 2 4 6 - la multiplication s'applique à chaque élément sans boucle. La plupart du code qui serait une boucle for dans un autre langage tient en une seule expression en R.