103 votes

Comment enregistrer toutes les données de sortie de la console dans un fichier dans R ?

Je souhaite réorienter tous texte de la console dans un fichier. Voici ce que j'ai essayé :

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

Voici ce que j'ai obtenu dans test.log :

[1] "a"

Voici ce que je veux dans test.log :

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

Qu'est-ce que je fais de travers ? Merci de votre compréhension.

126voto

Tommy Points 16323

Vous devez indiquer "output" et "message" séparément (l'option "output" et "message" n'est pas disponible). sink ne prend en compte que l'élément premier élément de type )

Maintenant, si vous voulez le entrée pour qu'il soit également enregistré, placez-le dans un script :

script.R

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

Et à l'invite :

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 votes

Cette méthode n'imprime que les données de sortie, mais pas les données d'entrée. Je veux voir la ligne d'entrée, par exemple 1:5 + 1:3 suivi de sa sortie, puis de la suivante, etc. La raison pour laquelle je veux produire ce type de journal est que j'ai un programme qui prend 30+ GBytes de RAM pour fonctionner. Je l'exécute sur amazon cloud et je sauvegarde les résultats des régressions dans des fichiers individuels. Je veux pouvoir trouver rapidement le code qui a produit chaque fichier en regardant le journal. Remarque : si je me contente de copier-coller la sortie de la console, cela fonctionne.

6 votes

@user443854 Si c'est le cas, il est préférable d'abandonner le travail interactif et de travailler avec des scripts.

5 votes

@user443854 : Oui, pouvez-vous mettre le code dans un script ? Dans ce cas, source("script.R", echo=TRUE) ferait l'affaire - si vous redirigez la sortie comme expliqué ci-dessus.

15voto

WMash Points 277

Si vous avez accès à une ligne de commande, vous préférerez peut-être exécuter votre script à partir de la ligne de commande avec R CMD BATCH.

\== commencer le contenu de script.R ==

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

\== fin du contenu de script.R ==

À l'invite de commande ("$" dans de nombreuses variantes d'un*x, "C:>" sous Windows), exécutez

$ R CMD BATCH script.R &

Le "&" de fin est facultatif et exécute la commande en arrière-plan. Le nom par défaut du fichier journal comporte l'extension "out", c'est-à-dire script.Rout

\== commencer le contenu de 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

\== contenu final de script.Rout ==

4voto

user5359531 Points 902

Si vous pouvez utiliser le shell bash, vous pouvez envisager d'exécuter simplement le code R à partir d'un script bash et d'envoyer les flux stdout et stderr vers un fichier. Voici un exemple utilisant un heredoc :

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

Ensuite, lorsque vous exécutez le script avec stderr et stdout dans un fichier journal :

$ 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

D'autres solutions pourraient être envisagées pour essayer d'extraire le stdout et le stderr directement du R heredoc dans un fichier journal ; je n'ai pas encore essayé, mais cela fonctionnera probablement aussi.

3voto

Brian Flaherty Points 113

Exécutez R dans emacs avec ESS (Emacs Speaks Statistics) r-mode. J'ai une fenêtre ouverte avec mon script et le code R. Une autre fenêtre contient R en cours d'exécution. Le code est envoyé depuis la fenêtre de syntaxe et évalué. Les commandes, les résultats, les erreurs et les avertissements apparaissent tous dans la session de la fenêtre R en cours d'exécution. À la fin d'une période de travail, j'enregistre tous les résultats dans un fichier. Mon propre système de dénomination est *.R pour script et *.Rout pour enregistrer les fichiers de sortie. Voici une capture d'écran avec un exemple. Screenshot writing and evaluating R with Emacs/ESS.

3voto

mbq Points 8963

Vous ne pouvez pas. Vous pouvez tout au plus économiser de l'énergie avec sink et l'entrée avec savehistory séparément. Ou utiliser un outil externe comme script , screen ou tmux .

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X