Warum ist die Nachricht() die bessere Wahl als print() in R zu schreiben, ein Paket?
Ich hoffe, Sie wissen, warum message()
ist eine bessere Wahl als print()
wenn es um die Druck-Diagnosemeldungen.
Beispielsweise die print()
Funktion ist die bessere Wahl zum drucken von R-Objekt, wie 'iris'
, in der Erwägung, dass message()
ist besser, wenn wir wollen, dass zum verketten von strings z.B. message("a", "b")
ist kürzer als print(paste0("a", "b"))
.
Aber ich denke, es gibt mehr Unterschiede als die einfache, oben aufgelistet. Ich habe gelesen, in der Dokumentation für beide Methoden
- http://stat.ethz.ch/R-manual/R-devel/library/base/html/message.html,
- http://stat.ethz.ch/R-manual/R-devel/library/base/html/print.html
aber, es scheint, Sie sind nicht so informativ wie ich gehofft hatte auf meine Frage.
Ich würde mich freuen, wenn jemand uns wissen lassen, in welchem Fall message()
ist besser als print()
- und warum.
- Ich größtenteils Zustimmen, aber
message()
signalisiert auch eine "message", welchesuppressMessages()
erfasst.suppressMessages()
nicht unterdrücken pure stderr output, z.B.suppressMessages(cat("hello\n", file=stderr()))
zeigt nochhello
in der Konsole. stop
,warning
,message
alle signal-Zustände, was ist, was macht Sie abfangen / unterdrücken-in der LagetryCatch(message("hello"), message=force)
;cat(file=stderr())
ist schlechter Stil (und wirkungslos, wie dein Beispiel zeigt!) wenn das die Absicht ist, um zu signalisieren Diagnose-Zustand.
Du musst angemeldet sein, um einen Kommentar abzugeben.
TL;DR
Sollten Sie verwenden
cat()
bei derprint.*
Funktionen für die S3-Objekte. Für alles andere verwenden, sollten Siemessage()
es sei denn, der Status des Programms ist problematisch. z.B. schlechte Fehler, der Ordner " Wiederherstellbare gibtwarning()
vs. show-stopping Fehler verwendetstop()
.Ziel
Ziel dieses Beitrags ist es, feedback zu geben über die verschiedene Ausgabe-Optionen, die ein Paket-Entwickler Zugriff hat und wie sollte man die Struktur der Ausgabe, die potenziell auf ein neues Objekt oder basierend auf strings.
R Ausgang Übersicht
Den traditionellen output-Funktionen sind:
print()
cat()
message()
warning()
stop()
Nun, die ersten beiden Funktionen (
print()
undcat()
) senden Sie Ihre Ausgabestdout
oder standard-Ausgabe. Die letzten drei Funktionen (message()
,warning()
, undstop()
) senden Sie Ihre Ausgabestderr
oder die standard-Fehler. Das heißt, die Ergebnis output von einem Befehl wielm()
gesendet wird, um zu einer Datei, und der Fehler-Ausgabe - wenn vorhanden - an einen völlig separaten Datei. Dies ist besonders wichtig für die user experience als Diagnose-dann sind nicht überladen die Ausgabe der Ergebnisse in log-Dateien und Fehler sind dann verfügbar, um die Suche schnell durch.Entwerfen für Benutzer und Externe Pakete
Nun, die oben ist gerahmt noch in eine I/O Denkweise und nicht unbedingt ein Benutzer-zugewandten frameset. Also, lassen Sie uns Ihnen einige motivation im Kontext des alltäglichen R Benutzer. Insbesondere durch die Verwendung von 3-5 oder die
stderr
Funktionen, die Ihren Ausgang in der Lage ist, unterdrückt werden, ohne basteln mit der Konsole text übersink()
. Die Unterdrückung kommt normalerweise in form vonsuppressWarnings()
,suppressMessages()
,suppressPackageStartupMessages()
, und so weiter. Damit der Benutzer nur konfrontiert mit dem Ergebnis konfrontiert Ausgabe. Dies ist besonders wichtig, wenn Sie planen, um Benutzern die Flexibilität, das ausschalten von text-basierte Ausgabe bei der Erstellung von dynamischen Dokumenten entweder über knitr, rmarkdown, oder Sweave.Insbesondere
knitr
bietet chunk-Optionen wieerror = F
,message = F
, undwarning = F
. Dies ermöglicht die Reduzierung der Begleittext einen Befehl in das Dokument. Außerdem wird so verhindert, dass die Notwendigkeit, die aus der Verwendung derresults = "hide"
option, dass würde Sie auf alle deaktivieren Ausgabe.Besonderheiten der Ausgang
print()
Zuerst haben wir ein oldie aber ein goodie
print
. Diese Funktion hat einige schwerwiegende Einschränkungen. Einer von Ihnen ist der Mangel an embedded-Verkettung von Bedingungen. Die zweite und wahrscheinlich noch schwerer, ist die Tatsache, dass jeder Ausgabe vorangestellt ist[x]
gefolgt von Zitaten rund um den eigentlichen Inhalt. Diex
in diesem Fall bezieht sich auf die element-Nummer gedruckt werden. Dies ist nützlich für debugging-Zwecke, aber außerhalb, dass es nicht dazu.z.B.
Für die Verkettung, wir verlassen uns auf die
paste
Funktion arbeitet synchron mitprint
:Alternativ kann man die
paste0(...)
Funktion anstelle vonpaste(...)
zu vermeiden, die die Standard-Verwendung von a Raum zwischen den Elementen unterliegtpaste()
'ssep = " "
parameter. (ein.k.eine Verkettung ohne Leerzeichen)z.B.
cat()
Auf der anderen Seite
cat()
- Adressen all diese Kritiken. Vor allem diesep=" "
parameter derpaste()
Funktionalität integriert ist, so dass ein überspringen schreibenpaste()
innerhalbcat()
. Jedoch, diecat()
Funktion der einzige Nachteil ist, Sie zu zwingen, neue Linien über\n
an das Ende oderfill = TRUE
(verwendet Standard-Druckbreite).z.B.
Dies ist auch der Grund, warum Sie verwenden sollten
cat()
bei der Gestaltung einesprint.*
S3-Methode.message()
Den
message()
Funktion ist ein Schritt besser als garcat()
! Der Grund ist, warum die Ausgabe unterscheidet sich von traditionellen Klartext, wie es ist Regie zustderr
stattstdout
. E. g. Sie verändert die Farbe aus der standard-Ausgabe von schwarz auf rot Ausgang zu fangen die Benutzer Auge.Darüber hinaus haben Sie die gebaut
paste0
Funktionalität.Darüber hinaus
message()
bietet einen Fehlerzustand, kann verwendet werden, mittryCatch()
z.B.
warning()
Die Warnfunktion ist nicht etwas beiläufig. Die Warnung Funktion unterscheidet sich von der Nachricht Funktion in Erster Linie durch eine Linie preappended zu ("Warnung:") und seinen Zustand zu prüfen, problematisch zu sein.
Sonstiges: gelegentliche Nutzung in einer Funktion kann versehentlich auslösen, Herzschmerz, während Sie versuchen, laden Sie das Paket zu CRAN durch das Beispiel überprüft und Warnungen, die normalerweise behandelt werden, als "Fehler".
stop()
Last but not least, haben wir
stop()
. Dies dauert Warnungen auf die nächste Ebene, indem Sie vollständig zu töten die Aufgabe und zurückgeben der Steuerung an den Benutzer. Darüber hinaus hat es die meisten schweren Anhängsel mit dem Begriff "Fehler:" Hinzugefügt.message("hello world")
undcat("hello world", sep="\n")
bei der Gestaltung eines print.* S3-Methode?cat
z.B.cat("hello world", "antonio", sep="\n")
, die Differenz wird eine Zeile mithello world
und ein weiteres mitantonio
. Obwohlmessage()
halten alles auf der gleichen Linie.print
Beispiel zeigtprint(paste0("Hello","World!"))
geben[1] "Hello World!"
aber es sollte[1] "HelloWorld!"
(ohne Raum - wie Sie in der Erklärung)print
ist, dass es nicht erweitern escape-Zeichen. Alsoprint(paste0('Spam\n', 'Egg\n', 'Spam\n'))
produziert[1] "Spam\nEgg\nSpam\n"
anstatt jedes Element in einer separaten Zeile.cat()
odermessage()
als Teil einersummary.*()
Funktion?print.summary.*()
write
stackoverflow.com/questions/1109017/...