87 votes

Pourquoi message () est-il un meilleur choix que print () en R pour écrire un paquet?

J'espère savoir pourquoi message() est un meilleur choix que l' print() quand il s'agit de l'impression des messages de diagnostic.

Par exemple, l' print() fonction est un meilleur choix pour imprimer des R objet tel qu' 'iris', alors que, message() est mieux quand on veut concaténer des chaînes de caractères par exemple, message("a", "b") est plus courte que print(paste0("a", "b")).

Cependant, je pense qu'il y a plus de différences que ces simples ceux énumérés ci-dessus. J'ai lu la documentation pour les deux méthodes

mais, il semble qu'ils ne sont pas aussi instructif que je l'avais espéré à ma question.

J'apprécierais si quelqu'un laissez-nous savoir dans quel cas message() est mieux que print(), et pourquoi.

158voto

coatless Points 10952

TL;DR

Vous devez utiliser cat() lors de la prise de l' print.* fonctions pour les objets S3. Pour tout le reste, vous devez utiliser message() , à moins que l'état du programme est problématique. par exemple une mauvaise erreur qui est récupérable donne warning() vs show stopper erreur utilisations stop().

Objectif

L'objectif de ce post est de fournir de la rétroaction sur les différentes options de sortie un paquet développeur dispose de l'accès et de la façon de la structure de sortie qui est potentiellement sur un objet ou sur des chaînes de caractères.

Sortie R Vue D'Ensemble

Les traditionnelles fonctions de sortie sont:

  1. print()
  2. cat()
  3. message()
  4. warning()
  5. stop()

Maintenant, les deux premières fonctions (print() et cat()) envoyer leur sortie d' stdout ou de sortie standard. Les trois dernières fonctions (message(), warning(), et stop()) envoyer leur sortie d' stderr ou l'erreur standard. C'est, le résultat de sortie d'une commande comme celle - lm() est envoyé à un fichier et la sortie d'erreur - si elle existe - est envoyé à un tout autre fichier. Ceci est particulièrement important pour l'expérience utilisateur que les diagnostics sont alors de ne pas encombrer la sortie des résultats dans des fichiers journaux et les erreurs sont alors disponible pour la recherche rapide.

La conception pour les Utilisateurs et les Paquets Externes

Maintenant, le ci-dessus est encadrée de plus dans un I/O état d'esprit et pas nécessairement un utilisateur face du jeu de cadres. Donc, nous allons fournir une motivation pour elle dans le contexte d'un quotidien R l'utilisateur. En particulier, par l'utilisation de 3 à 5 ou de l' stderr fonctions, leur production est en mesure d'être supprimée sans bricoler avec la console de texte via sink(). La répression, c'est généralement sous la forme de suppressWarnings(), suppressMessages(), suppressPackageStartupMessages(), et ainsi de suite. Ainsi, les utilisateurs sont confrontés à de suite en face de la sortie. Ceci est particulièrement important si vous envisagez de permettre aux utilisateurs la flexibilité de la désactivation de sortie en texte lors de la création dynamique de documents via knitr, rmarkdown, ou Sweave.

En particulier, knitr offre morceau options telles que l' error = F, message = F, et warning = F. Cela permet de réduire la texte accompagnant une commande dans le document. En outre, cela évite le besoin de l'aide de l' results = "hide" la possibilité de désactiver toutes les sorties.

Détails de la Sortie

print()

D'abord, nous avons un oldie, mais un goodie, print. Cette fonction a certaines limitations sévères. L'un d'eux étant le manque de incorporés concaténation de termes. La seconde, et sans doute plus grave, est le fait que chaque sortie est précédée par [x] suivie par les citations sur le contenu. L' x dans ce cas se réfère à l'élément en cours d'impression. Ceci est utile pour des fins de débogage, mais en dehors de cela il n'a pas lieu d'être.

par exemple

print("Hello!")

[1] "Hello!"

Pour la concaténation, nous nous appuyons sur l' paste fonction de travailler en synchronisation avec print:

print(paste("Hello","World!"))

[1] "Hello World!"

Alternativement, on peut utiliser l' paste0(...) fonction à la place de paste(...) afin d'éviter l'utilisation par défaut d'un espace entre les éléments régis par l' paste()s' sep = " " paramètre. (un.k.une concaténation sans les espaces)

par exemple

print(paste0("Hello","World!"))

[1] "HelloWorld!"

print(paste("Hello","World!", sep = ""))

[1] "HelloWorld!"

cat()

Sur le revers de la médaille, cat() répond à toutes ces critiques. Plus particulièrement, l' sep=" " paramètre de l' paste() fonctionnalité est intégrée en permettant de sauter la rédaction paste() dans cat(). Cependant, l' cat() fonction du seul inconvénient est que vous devez forcer de nouvelles lignes via \n ajouté à la fin ou fill = TRUE (utilise par défaut de la largeur d'impression).

par exemple

cat("Hello!\n")
Hello!

cat("Hello","World!\n")
Hello World!

cat("Hello","World!\n", sep = "")
HelloWorld!

C'est pour cette raison, vous devez utiliser cat() lors de la conception d'un print.* S3 méthode.

message()

L' message() fonction est une étape mieux que, même cat()! La raison en est que la sortie est distincte de la traditionnelle plaine de texte en tant qu'il est dirigé vers stderr au lieu de stdout. E. g. Ils ont changé la couleur standard noir de sortie de sortie rouge pour attraper les utilisateurs de l'œil.

Message Output

En outre, vous avez le construit en paste0 fonctionnalités.

message("Hello ","World!") # Note the space after Hello
"Hello World!"

En outre, message() fournit un état d'erreur qui peut être utilisé avec tryCatch()

par exemple

 tryCatch(message("hello\n"), message=function(e){cat("goodbye\n")})
 goodbye

warning()

La fonction d'avertissement n'est pas quelque chose à utiliser à la légère. La fonction d'avertissement est différenciée de la fonction de message principalement par le fait d'avoir une ligne preappended à la (message d'Avertissement":") et son état est considéré comme problématique.

warning output

Divers: Casual utiliser dans une fonction peut déclencher par inadvertance chagrin, tout en essayant d'envoyer le paquet à CRAN à cause de l'exemple des contrôles et des mises en garde normalement être traités comme des "erreurs".

stop()

Dernier mais non le moindre, nous avons stop(). Cela prend des avertissements au prochain niveau et d'en tuer la tâche à portée de main et de rendre le contrôle à l'utilisateur. En outre, il est le plus important appendice avec le terme "Erreur:" être ajouté.

Error Output

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X