¿Cómo guardar toda la salida de la consola en un archivo en R?


82

Quiero redirigir todo el texto de la consola a un archivo. Esto es lo que probé:

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

Esto es lo que obtuve en test.log:

[1] "a"

Esto es lo que quiero en test.log:

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

¿Qué estoy haciendo mal? ¡Gracias!


Respuestas:


105

Tienes que hundir "salida" y "mensaje" por separado (la sinkfunción solo mira el primer elemento de type)

Ahora, si desea que la entrada también se registre, colóquela en un script:

script.R

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

Y en el aviso:

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
Imprime solo la salida, pero no imprime la entrada. Quiero ver la línea de entrada, por ejemplo 1:5 + 1:3, seguida de su salida, luego la siguiente, etc. La razón por la que quiero producir este tipo de registro es porque tengo un programa que necesita más de 30 GBytes de RAM para ejecutarse. Lo ejecuto en la nube de Amazon y guardo los resultados de las regresiones en archivos individuales. Quiero poder encontrar rápidamente el código que produjo cada archivo mirando el registro. Nota: si solo corté y pego la salida de la consola, eso es todo.
user443854

5
@ user443854 Si es así, es mejor dejar el trabajo interactivo y trabajar con scripts.
mbq

5
@ user443854: Sí, ¿puedes poner el código en un script? En ese caso, source ("script.R", echo = TRUE) haría el truco, si redirige la salida como se explicó anteriormente.
Tommy

@Tommy Tú eres el hombre. ¡Gracias! Tengo un script .R, pero lo estaba pegando en la sesión interactiva en el cuadro remoto. Abastecerse hace el truco.
user443854

2
@ user443854: Sí, usa el max.deparse.lengthargumento. Actualicé la respuesta.
Tommy

10

Si tiene acceso a una línea de comando, es posible que prefiera ejecutar su script desde la línea de comando con R CMD BATCH.

== comenzar el contenido del script.R ==

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

== contenido final del script.R ==

En el símbolo del sistema ("$" en muchas variantes un * x, "C:>" en Windows), ejecute

$ R CMD BATCH script.R &

El "&" final es opcional y ejecuta el comando en segundo plano. El nombre predeterminado del archivo de registro tiene "out" agregado a la extensión, es decir, script.

== comenzar el contenido del 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

== contenido final del script.Rout ==


1
Estoy utilizando zsh, por alguna razón R CMD BATCH script.R &no funciona.
Gilbert

3

No puedes. Como máximo, puede guardar la salida sinky la entrada con por savehistoryseparado. O use una herramienta externa como script, screeno tmux.


2

Ejecute R en emacs con el modo r de ESS (Emacs Speaks Statistics). Tengo una ventana abierta con mi script y código R. Otro tiene R corriendo. El código se envía desde la ventana de sintaxis y se evalúa. Los comandos, resultados, errores y advertencias aparecen en la sesión de la ventana de R en ejecución. Al final de un período de trabajo, guardo toda la salida en un archivo. Mi propio sistema de nombres es * .R para scripts y * .Rout para guardar archivos de salida. Aquí hay una captura de pantalla con un ejemplo.Redacción de capturas de pantalla y evaluación de R con Emacs / ESS.


0

Si puede usar el shell bash, puede considerar simplemente ejecutar el código R desde dentro de un script bash y canalizar los flujos stdout y stderr a un archivo. Aquí hay un ejemplo usando un heredoc:

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

Luego, cuando ejecuta el script con stderr y stdout canalizados a un archivo de registro:

$ 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

Otras cosas a tener en cuenta para esto sería intentar simplemente pasar stdout y stderr directamente desde el R heredoc en un archivo de registro; No lo he probado todavía, pero probablemente también funcione.



0

Configure sus preferencias de Rgui para una gran cantidad de líneas, luego marque la hora y guárdelo como archivo a intervalos adecuados.



0

Si desea recibir mensajes de error

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

la salida será:

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

Esta salida se guardará en un archivo llamado Errores.txt

En caso de que desee imprimir valores de la consola en un archivo, puede usar el argumento 'dividir':

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

la salida será:

[1] "cool"

en el archivo console.txt. Entonces toda la salida de su consola se imprimirá en un archivo llamado console.txt


0

Puede imprimir en un archivo y al mismo tiempo ver el progreso que tiene (o no), screenpor ejemplo, mientras ejecuta un script R.

  1. En una terminal, pantalla de inicio

    screen
    
  2. ejecuta tu script R

    R CMD BATCH yourscript.R
    
  3. Ir a otra pantalla presionando CtrlA, luegoc

  4. mire su salida con (en tiempo real):

    tail -f yourscript.Rout
    
  5. Cambiar entre pantallas con CtrlAluegon

Alternativamente, cuando no use la pantalla, use R CMD BATCH yourscript.R &en el paso 2.

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.