2014-01-23 4 views
8

Ich möchte eine Protokolldatei erstellen, die alle Befehle verfolgt (stdin), Ergebnisse (stdout) und Fehler/Warnungen/Meldungen (stderr) in der R-Konsole.Wie man eine Protokolldatei einer R-Sitzung erstellt, die Befehle, Ergebnisse und Warnungen/Meldungen/Fehler von der R-Konsole kombiniert

ich weiß, dass es eine Menge von Logging-Paketen ist und ich versuchte mehr wie TeachingDemos (scheint Stderr vollständig zu ignorieren) oder R2HTML (scheint Nachrichten zu ignorieren), aber keiner von ihnen scheint alles von stderr schließen.

Nur knitr und markdown scheinen in der Lage zu sein, alles in eine einzige Datei einzuschließen. Aber mit dieser Problemumgehung muss ich R-Skripte schreiben und ich kann nicht frei Befehle in der Konsole schreiben.
Darüber hinaus kann ich den Befehl knitr oder markdown nicht in das gleiche R-Skript einfügen (was natürlich ein kleines Problem ist).

Hier ist ein Beispiel:

library(TeachingDemos) 
library(R2HTML)  
library(TraMineR) 

logdir <- "mylog.dir" 

txtStart(file=paste(logdir,"test.txt", sep=""), commands=TRUE, 
     results=TRUE, append=FALSE) 
HTMLStart(outdir = logdir, file = "test", echo=TRUE, HTMLframe=FALSE) 

## Messages, warnings and errors 
message("Print this message.") 
warning("Beware.") 
"a" + 1 
geterrmessage() 

## Some example application with the TraMiner package 
## which uses messages frequently 
data(mvad) 
mvad.seq <- seqdef(mvad[, 17:86]) 
mvad.ham <- seqdist(mvad.seq, method="HAM") 

txtStop() 
HTMLStop() 
+0

Was ist Ihr Betriebssystem? – flodel

+0

Ich habe es unter Windows und Ubuntu versucht. –

+0

Verwenden Sie "sinken"? Sehen Sie, ob das genug erfasst. –

Antwort

7

Wenn Sie R ausgeführt werden von einem Unix/Linux/Mac/etc. Terminal, können Sie tun:

R | tee mydir/mylog.txt 

Unter Windows können Sie das Skript in

R CMD BATCH yourscript.R 

und Ihr Ergebnis erscheint im selben Ordner wie yourscript.out

+1

Schön - genauer gesagt, das funktioniert überall dort, wo Sie eine bash/csh/sh/ksh-Umgebung haben. Ich benutze zum Beispiel Cygwin. –

+0

Danke, Batch-Jobs sind eine gute Möglichkeit, R zu verwenden. Der Arbeitsablauf mit Batch-Jobs ist jedoch fast der gleiche wie bei der Verwendung von 'Knitr' oder' Markdown'. Vielleicht gibt es einen "Sinken" ähnlichen Ansatz, der alle Ausgaben holt? –

+0

'R | tee log.txt' verwendet keinen Batch-Job, sondern eine R-Sitzung von einem Terminal. Hast du es versucht? – flodel

1

Auf Unix-Varianten laufen, ich habe oft verwendet, den folgenden Code ein Idiom mit bash:

Some Command 2>&1 | tee NameOfOutputFile.txt 

die "2> & 1" sagt, stderr zu nehmen und es auf stdout umzuleiten, was dann zu "tee" piped wird. Ich werde mit dieser und anderen Möglichkeiten der Protokollierung einer R-Sitzung experimentieren.

Ein weiterer Unix-Trick ist der Befehl "script", der eine Subshell startet, deren I/O (im Grunde alles, was Sie eingeben und sehen) in der angegebenen Datei protokolliert wird. Beenden Sie dann die Shell, um das Skript zu beenden. Erneut zu experimentieren. Da "Senke" für R typisch ist, werde ich das zuerst versuchen.

Übrigens, ich wählte diese Tricks mit Solaris, aber sie arbeiten die gleichen Cygwin, der Unix-Emulator unter Windows. Vor langer Zeit stellte ich fest, dass meine Cygwin-Bilder aktueller waren als die institutionellen Installationen von Solaris, weil die Administratoren viel mehr Verantwortung hatten, als nur die Solaris auf dem neuesten Stand zu halten. Wohlgemerkt, die institutionellen Maschinen waren leistungsfähiger, und obwohl Cygwin viel bequemer war, füllte meine persönliche Maschine einfach nicht das Bedürfnis.

AFTERNOTE:

nahm ich Beispiel-Code ab Seite 99 von Shumway's Time Series Analysis and Its Applications With R examples. Hier sind die Inhalte einer Testdatei palette.R:

r 
plot(gnp) 
acf2(gnp, 50) 
gnpgr = diff(log(gnp)) # growth rate 
plot(gnpgr) 
acf2(gnpgr, 24) 
sarima(gnpgr, 1, 0, 0) # AR(1) 
sarima(gnpgr, 0, 0, 2) # MA(2) 
ARMAtoMA(ar=.35, ma=0, 10) # prints psi-weights 
quit("no") 
exit 

ich angerufen es mit:

Skript < Palette.R

Er erfasst die Befehle von palette.R und die entsprechende Ausgabe. Also, scheint für den Batch-Modus verwendbar. Für den interaktiven Modus werde ich mit meinem ursprünglichen Plan gehen und Senke verwenden.