2011-08-17 1 views
50

Desidero reindirizzare lo tutto il testo della console in un file. Ecco quello che ho provato:Come salvare l'output di tutte le console in un file in R?

> 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" 

Ecco quello che ho ottenuto in test.log:

[1] "a" 

Qui è quello che voglio in test.log:

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

Che cosa sono io fare male? Grazie!

risposta

65

si deve affondare "uscita" e "messaggio" a parte (la funzione sink guarda solo l'elemento prima di type)

Ora, se si desidera che il ingresso da registrare anche, poi mettere in uno script:

script.R

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

E al prompt:

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") 
+1

Questa stampa stampa solo l'output, ma non stampa. Voglio vedere la linea di input, ad es. '1: 5 + 1: 3', seguito dal suo output, poi next, ecc. Il motivo per cui voglio produrre questo tipo di log è perché ho un programma che richiede 30+ GByte di RAM da eseguire. Lo eseguo su Amazon Cloud e salviamo l'output dalle regressioni ai singoli file. Voglio essere in grado di trovare rapidamente il codice che ha prodotto ogni file guardando il registro. Nota: se faccio solo l'output della console cut-n-paste, lo farà. – user443854

+5

@ user443854 Se è così, è un'idea migliore abbandonare il lavoro interattivo e lavorare con gli script. – mbq

+4

@ user443854: Sì, puoi inserire il codice in uno script? In quel caso l'origine ("script.R", echo = TRUE) farebbe il trucco - se si reindirizza l'output come spiegato sopra. – Tommy

3

Non è possibile. Al massimo è possibile salvare l'output con sink e immettere separatamente con savehistory. O utilizzare uno strumento esterno come script, screen o tmux.

9

Se si ha accesso a una riga di comando, è preferibile eseguire lo script dalla riga di comando con R CMD BATCH.

== iniziano contenuto di script.R ==

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

contenuti finali == del == script.R

Al prompt dei comandi ("$" in molte Un * x varianti, "C:>" in Windows), eseguire

$ R CMD BATCH script.R & 

il trailing "&" è opzionale ed esegue il comando in background. Il nome di default del file di registro è "out" aggiunto al estensione, vale a dire, script.Rout

== iniziano contenuto di script.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 

contenuti END == di script. Rout ==

+1

Sto utilizzando zsh, per qualche ragione' R script BDCH di CMD.R & 'non funziona. – Gilbert

0

Se si è in grado di utilizzare la shell bash, è possibile considerare semplicemente l'esecuzione del codice R da uno script bash e il piping dei flussi stdout e stderr su un file.Ecco un esempio utilizzando un heredoc:

File: 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 

Poi, quando si esegue lo script sia con stderr e stdout convogliato ad un file di log:

$ 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 

Altre cose da cercare per questo sarebbe come provare semplicemente a copiare lo stdout e lo stderr direttamente dal file Rededoc in un file di registro; Non ho ancora provato questo, ma probabilmente funzionerà anche.

1

Eseguire R in emacs con ESS (Emacs Speaks Statistics) r-mode. Ho una finestra aperta con il mio script e il codice R. Un altro ha R in esecuzione. Il codice viene inviato dalla finestra di sintassi e valutato. Comandi, output, errori e avvisi appaiono tutti nella sessione della finestra R in esecuzione. Alla fine di un periodo di lavoro, salverò tutto su un file. Il mio sistema di denominazione è * .R per gli script e * .Rout per salvare i file di output. Ecco uno screenshot con un esempio. Screenshot writing and evaluating R with Emacs/ESS.

0

Per salvare il testo dalla console: eseguire l'analisi e quindi scegliere (Windows) "File> Salva su file".

+1

Se hai una nuova domanda, per favore chiedi facendo clic sul pulsante [Chiedi domanda] (https://stackoverflow.com/questions/ask). Includere un collegamento a questa domanda se aiuta a fornire il contesto. - [Dalla recensione] (/ recensione/post di bassa qualità/18957447) – Dmitry