Menu

Afficher des résultats et lire des entrées en R (print, cat, readline)

Comment fonctionne la sortie en R - affichage automatique, print() ou cat(), message() - et comment lire les saisies de l'utilisateur avec readline() et readLines().

Cette page contient des éditeurs exécutables - modifiez, exécutez et voyez la sortie instantanément.

Comment fonctionne l'affichage en R

R a une habitude qu'aucun autre langage grand public ne partage : en console, tu n'as besoin d'aucune instruction d'affichage. Tape le nom d'une variable, appuie sur Entrée, et R affiche sa valeur. C'est l'affichage automatique, et c'est pour ça que les tutoriels R sont pleins d'expressions nues.

Mais l'affichage automatique a une limite stricte : il ne se déclenche que pour les expressions au niveau supérieur. Dans une boucle for ou un corps de fonction, une valeur nue est évaluée puis jetée en silence :

Le x isolé s'affiche (il est au niveau supérieur), la première boucle n'affiche absolument rien, et la seconde affiche 1, 2, 3 parce qu'elle le demande explicitement. « Ma boucle tourne mais ne montre rien » est l'une des questions les plus posées sur R, et voilà toute la réponse : dans les boucles et les fonctions, l'affichage est toujours ton travail. (La même chose vaut quand tu lances un script avec Rscript - ce qui marchait ligne par ligne en console peut devenir muet dans une boucle.)

print() montre une valeur telle que R la voit - ce qui en fait le bon outil pour inspecter des données, et le mauvais pour une sortie soignée :

Deux choses sautent aux yeux. Les chaînes gardent leurs guillemets - print() te montre une représentation fidèle, et les guillemets t'indiquent qu'il s'agit d'une valeur character. Et chaque ligne commence par un nombre entre crochets comme [1] : c'est l'indice du premier élément de cette ligne, donc quand un long vecteur se replie sur plusieurs lignes, le crochet de chaque ligne te dit à quel élément elle reprend. C'est une aide à la lecture des vecteurs, pas du bruit.

Si tu veux une sortie de style print() sans les guillemets, print(x, quote = FALSE) et noquote(x) le font tous les deux - mais à ce stade, ce que tu veux vraiment est généralement cat().

cat() : la sortie pour les humains

cat() (concatenate-and-print) écrit du texte brut : pas de guillemets, pas de préfixes d'indice, et ses arguments joints par des espaces. Le prix de ce contrôle, c'est que rien n'est ajouté à ta place - y compris le saut de ligne :

Oublier le "\n" est le rite de passage universel de cat() - sans lui, la sortie suivante se colle sur la même ligne. Fais de « terminer un cat() par "\n" » un réflexe.

La différence de guillemets entre les deux fonctions est en réalité une différence sur ce qu'elles montrent. print() affiche les séquences d'échappement telles que tu les as tapées ; cat() les rend :

print() montre le \t et le \n littéralement entre guillemets - utile quand tu débogues le contenu exact d'une chaîne. cat() les transforme en une vraie tabulation et un vrai saut de ligne - utile quand tu produis une sortie. Choisis selon ton intention : print() pour inspecter, cat() pour présenter.

Rapports formatés : sprintf() + cat()

Les arguments séparés par des espaces de cat() ont leurs limites. Pour une sortie alignée et formatée - décimales fixes, compteurs complétés - construis la chaîne avec sprintf() et donne-la à cat() :

%-8s complète chaque nom à 8 caractères et %6.2f donne à chaque score la même largeur et deux décimales, donc les colonnes s'alignent. Ce duo est le cheval de bataille de R de base pour les messages de progression et les petits rapports texte (les codes de format sont traités dans les chaînes).

message() et warning() : l'autre canal

cat() et print() écrivent sur la sortie standard - le flux qui contient les résultats de ton programme. message() et warning() écrivent sur l'erreur standard, le flux réservé aux commentaires sur l'exécution :

À l'écran les deux se ressemblent, mais la séparation compte dès que la sortie est redirigée : redirige le stdout de ton script vers un fichier et le 42 atterrit dans le fichier tandis que la note d'état reste sur le terminal. C'est la règle empirique - les résultats vers stdout avec cat(), les commentaires vers stderr avec message(). C'est aussi pourquoi message() (et non cat()) est la façon polie pour les fonctions et les packages de s'adresser à leurs utilisateurs : les appelants peuvent le faire taire avec suppressMessages() sans perdre la vraie sortie.

warning() est plus fort - « quelque chose cloche, mais j'ai continué » - et quand un script tourne sous Rscript, les avertissements sont regroupés et affichés ensemble à la fin plutôt qu'en ligne (voir déboguer les erreurs pour les lire).

Lire les saisies utilisateur : readline() et readLines()

Pour poser une question à l'utilisateur dans une session interactive (la console R ou RStudio), utilise readline(). Ces exemples ne sont pas exécutables dans l'éditeur intégré - le lanceur de la page n'a pas de panneau de saisie - alors essaie-les dans une console locale :

# Interactive sessions only:
name <- readline("What is your name? ")
cat("Hello,", name, "\n")

age <- as.numeric(readline("Your age? "))
cat("Next year you'll be", age + 1, "\n")

Deux choses à retenir. readline() renvoie toujours une chaîne - convertis avec as.numeric() avant de calculer, et vérifie le résultat pour NA au cas où l'utilisateur aurait tapé autre chose qu'un nombre. Et dans un script non interactif, readline() n'attend aucune saisie ; il renvoie immédiatement "".

Pour un script lancé avec Rscript qui doit lire une entrée redirigée ou tapée, lis plutôt l'entrée standard :

# In a script run as: echo "Ada" | Rscript greet.R
line <- readLines(con = "stdin", n = 1)
cat("Hello,", line, "\n")

readLines(con = "stdin") sans n lit toutes les lignes jusqu'à la fin de l'entrée - la forme standard des scripts de type filtre. Lire des fichiers de données est un autre travail avec de meilleurs outils ; commence par read-csv quand ton entrée est un jeu de données plutôt qu'un clavier.

Ce que tu retiens

  • L'affichage automatique ne se produit qu'au niveau supérieur - dans les boucles et les fonctions, appelle print() ou cat() toi-même.
  • print() inspecte : guillemets sur les chaînes, préfixes d'indice [1], échappements montrés littéralement.
  • cat() présente : texte brut, arguments joints par des espaces, et c'est toi qui fournis le "\n".
  • sprintf() + cat() est le motif de R de base pour une sortie formatée et alignée.
  • Les résultats vont vers stdout (cat), les commentaires vers stderr (message, warning).
  • readline() pour la saisie interactive (toujours une chaîne !) ; readLines(con = "stdin") pour Rscript.

Prochaine étape : les opérateurs - arithmétiques, de comparaison, et les opérateurs logiques qui pilotent chaque condition que tu écriras.

Questions fréquentes

Quelle est la différence entre print() et cat() en R ?

print() montre une valeur telle que R la représente - les chaînes gardent leurs guillemets et chaque ligne reçoit un préfixe d'indice du style [1]. cat() écrit du texte brut sans guillemets, sans indices, et sans saut de ligne automatique (tu ajoutes "\n" toi-même). Utilise print() pour inspecter des objets, cat() pour produire une sortie destinée à des humains.

Pourquoi ma boucle R n'affiche-t-elle rien ?

L'affichage automatique ne se déclenche que pour les expressions au niveau supérieur. Dans une boucle for ou un corps de fonction, un simple x est évalué puis silencieusement jeté. Demande-le explicitement : print(x) ou cat(x, "\n").

Comment lire une saisie utilisateur en R ?

Dans une session interactive, readline("prompt: ") lit une ligne saisie sous forme de chaîne (convertis avec as.numeric() s'il te faut un nombre). Dans un script lancé avec Rscript, readline() n'attend pas - lis plutôt l'entrée standard avec readLines(con = "stdin", n = 1).

Comment afficher sans guillemets en R ?

Utilise cat("hello\n") - il n'ajoute jamais de guillemets. Si tu veux précisément la sémantique de print() sans les guillemets, print("hello", quote = FALSE) ou noquote("hello") marchent aussi.

Coddy programming languages illustration

Apprendre à coder avec Coddy

COMMENCER