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:
print()
cat()
message()
warning()
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.
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.
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é.