Wie speichere ich die gesamte Konsolenausgabe in einer Datei in R?


84

Ich möchte den gesamten Konsolentext in eine Datei umleiten . Folgendes habe ich versucht:

> sink("test.log", type=c("output", "message"))
> a <- "a"
> a
> How come I do not see this in log
Error: unexpected symbol in "How come"

Folgendes habe ich in test.log bekommen:

[1] "a"

Folgendes möchte ich in test.log:

> a <- "a"
> a
[1] "a"
> How come I do not see this in log
Error: unexpected symbol in "How come"

Was mache ich falsch? Vielen Dank!


Antworten:


108

Sie müssen "Ausgabe" und "Nachricht" getrennt versenken (die sinkFunktion betrachtet nur das erste Element von type).

Wenn Sie nun möchten, dass die Eingabe auch protokolliert wird, fügen Sie sie in ein Skript ein:

script.R

1:5 + 1:3   # prints and gives a warning
stop("foo") # an error

Und an der Eingabeaufforderung:

con <- file("test.log")
sink(con, append=TRUE)
sink(con, append=TRUE, type="message")

# This will echo all input and not truncate 150+ character lines...
source("script.R", echo=TRUE, max.deparse.length=10000)

# Restore output to console
sink() 
sink(type="message")

# And look at the log...
cat(readLines("test.log"), sep="\n")

2
Dies druckt nur die Ausgabe, aber keine Eingabe. Ich möchte die Eingabezeile sehen, z. B. 1:5 + 1:3gefolgt von der Ausgabe, dann der nächsten usw. Der Grund, warum ich diese Art von Protokoll erstellen möchte, ist, dass ich ein Programm habe, das mehr als 30 GB RAM benötigt, um ausgeführt zu werden. Ich führe es in der Amazon Cloud aus und speichere die Ausgabe von Regressionen in einzelnen Dateien. Ich möchte in der Lage sein, den Code, der jede Datei erzeugt hat, schnell zu finden, indem ich mir das Protokoll ansehe. Hinweis: Wenn ich nur die Konsolenausgabe ausschneide und einfüge, ist das der Fall.
user443854

5
@ user443854 Wenn ja, ist es besser, interaktive Arbeit zu löschen und mit Skripten zu arbeiten.
mbq

5
@ user443854: Ja, können Sie den Code in ein Skript einfügen? In diesem Fall würde die Quelle ("script.R", echo = TRUE) den Trick ausführen - wenn Sie die Ausgabe wie oben erläutert umleiten.
Tommy

@ Tommy Du der Mann. Vielen Dank! Ich habe ein .R-Skript, aber ich habe es in die interaktive Sitzung auf der Remote-Box eingefügt. Die Beschaffung macht den Trick.
user443854

2
@ user443854: Ja, benutze das max.deparse.lengthArgument. Ich habe die Antwort aktualisiert.
Tommy

11

Wenn Sie Zugriff auf eine Befehlszeile haben, ziehen Sie es möglicherweise vor, Ihr Skript über die Befehlszeile mit R CMD BATCH auszuführen.

== Inhalt des Skripts beginnen.R ==

a <- "a"
a
How come I do not see this in log

== Endinhalt von script.R ==

Führen Sie an der Eingabeaufforderung ("$" in vielen un * x-Varianten, "C:>" in Windows) aus

$ R CMD BATCH script.R &

Das nachfolgende "&" ist optional und führt den Befehl im Hintergrund aus. Der Standardname der Protokolldatei hat "out" an die Erweiterung angehängt, dh script.Rout

== Inhalt des Skripts beginnen.Rout ==

R version 3.1.0 (2014-04-10) -- "Spring Dance"
Copyright (C) 2014 The R Foundation for Statistical Computing
Platform: i686-pc-linux-gnu (32-bit)

R is free software and comes with ABSOLUTELY NO WARRANTY.
You are welcome to redistribute it under certain conditions.
Type 'license()' or 'licence()' for distribution details.

  Natural language support but running in an English locale

R is a collaborative project with many contributors.
Type 'contributors()' for more information and
'citation()' on how to cite R or R packages in publications.

Type 'demo()' for some demos, 'help()' for on-line help, or
'help.start()' for an HTML browser interface to help.
Type 'q()' to quit R.

[Previously saved workspace restored]

> a <- "a"
> a
[1] "a"
> How come I do not see this in log
Error: unexpected symbol in "How come"
Execution halted

== Endinhalt von script.Rout ==


1
Ich benutze zsh, aus irgendeinem Grund R CMD BATCH script.R &funktioniert es nicht.
Gilbert

4

Das kannst du nicht. Sie können höchstens die Ausgabe mit sinkund die Eingabe mit savehistoryseparat speichern . Oder verwenden Sie externes Tool wie script, screenoder tmux.


3

Führen Sie R in Emacs mit dem ESS-R-Modus (Emacs Speaks Statistics) aus. Ich habe ein Fenster mit meinem Skript und R-Code geöffnet. Ein anderer hat R laufen. Code wird aus dem Syntaxfenster gesendet und ausgewertet. Befehle, Ausgaben, Fehler und Warnungen werden in der laufenden R-Fenstersitzung angezeigt. Am Ende einer Arbeitsperiode speichere ich die gesamte Ausgabe in einer Datei. Mein eigenes Benennungssystem ist * .R für Skripte und * .Rout für das Speichern von Ausgabedateien. Hier ist ein Screenshot mit einem Beispiel.Screenshot schreiben und R mit Emacs / ESS auswerten.


1

Wenn Sie die Bash-Shell verwenden können, können Sie den R-Code einfach in einem Bash-Skript ausführen und die Streams stdout und stderr an eine Datei weiterleiten. Hier ist ein Beispiel mit einem Heredoc:

Datei: test.sh

#!/bin/bash
# this is a bash script
echo "Hello World, this is bash"

test1=$(echo "This is a test")

echo "Here is some R code:"

Rscript --slave --no-save --no-restore - "$test1" <<EOF
  ## R code
  cat("\nHello World, this is R\n")
  args <- commandArgs(TRUE)
  bash_message<-args[1]
  cat("\nThis is a message from bash:\n")
  cat("\n",paste0(bash_message),"\n")
EOF

# end of script 

Wenn Sie dann das Skript mit stderr und stdout ausführen, die an eine Protokolldatei weitergeleitet werden:

$ chmod +x test.sh
$ ./test.sh
$ ./test.sh &>test.log
$ cat test.log
Hello World, this is bash
Here is some R code:

Hello World, this is R

This is a message from bash:

 This is a test

Andere Dinge, auf die Sie achten sollten, wären, einfach zu versuchen, stdout und stderr direkt aus dem R heredoc in eine Protokolldatei zu kopieren. Ich habe das noch nicht ausprobiert, aber es wird wahrscheinlich auch funktionieren.



1

Stellen Sie Ihre Rgui-Einstellungen für eine große Anzahl von Zeilen ein, stempeln Sie sie dann und speichern Sie sie in geeigneten Intervallen als Datei.


2
Bitte erläutern Sie
Bunbun

1

Sie können in eine Datei drucken und gleichzeitig den Fortschritt sehen (oder nicht) screen, während Sie ein R-Skript ausführen.

Wenn Sie den Bildschirm nicht verwenden, verwenden Sie R CMD BATCH yourscript.R &und Schritt 4.

  1. Wenn Sie den Bildschirm in einem Terminal verwenden, starten Sie den Bildschirm

     screen
    
  2. Führen Sie Ihr R-Skript aus

     R CMD BATCH yourscript.R
    
  3. Gehen Sie zu einem anderen Bildschirm drückt CtrlA, dannc

  4. Schauen Sie sich Ihre Ausgabe mit (Echtzeit) an:

     tail -f yourscript.Rout
    
  5. Wechseln zwischen Bildschirmen mit CtrlAdannn


1
  1. Wenn Sie Fehlermeldungen in einer Datei speichern möchten

    zz <- file("Errors.txt", open="wt")
    sink(zz, type="message")
    

    Die Ausgabe lautet:

    Error in print(errr) : object 'errr' not found
    Execution halted
    

    Diese Ausgabe wird in einer Datei mit dem Namen Errors.txt gespeichert

  2. Wenn Sie die Werte der Konsole in eine Datei drucken möchten, können Sie das Argument 'split' verwenden:

    zz <- file("console.txt", open="wt")
    sink(zz,  split=TRUE)
    print("cool")
    print(errr)
    

    Ausgabe wird sein:

    [1] "cool"
    

    in der Datei console.txt. Ihre gesamte Konsolenausgabe wird also in einer Datei mit dem Namen console.txt gedruckt

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.