2012-08-07 9 views
9

Duplicar posible:
R suppress startupMessages from dependencyAl usar Rscript, ¿hay una forma decente de suprimir la salida que no es de script?

he leído sobre el uso de sink("NUL")/sink("/dev/null"), pero ninguno de ellos ha solucionado el problema que estoy teniendo. Incluso si envuelvo los comandos library() en sink("NUL") y sink(), mi llamado a RSCRIPT da salida a todo tipo de información que no quiero ver:

Loading required package: Matrix 
Loading required package: methods 
Loading required package: lattice 
Loaded glmnet 1.8 

Loading required package: MASS 
Loading required package: lme4 

Attaching package: 'lme4' 

The following object(s) are masked from 'package:stats': 

    AIC, BIC 

Loading required package: R2WinBUGS 
Loading required package: coda 

Attaching package: 'coda' 

The following object(s) are masked from 'package:lme4': 

    HPDinterval 

Loading required package: abind 
Loading required package: foreign 

arm (Version 1.5-05, built: 2012-6-6) 

Working directory is C:/Users/andrews/bootstraps/user/_branches/ER-PoC/Bootstraps/R 


Attaching package: 'arm' 

The following object(s) are masked from 'package:coda': 

    traceplot 

[1] "client=51"   "date='01-01-2011'" 
[1] "01-01-2011" 
[1] 51 

Las cosas al final es la única salida realidad que quiero, y también es la única salida que puedo suprimir con los comandos sink(). Realmente parece que debería haber un argumento para Rscript que suprime esta salida (que ni siquiera aparece si yo source mi script en la consola) ... ¿alguna entrada?

+5

quizás '? SuppressPackageStartupMessages' ayudará? – Chase

+3

Solo quería mencionar en relación al cierre como duplicado que esta pregunta está haciendo sobre un guión y que está siendo marcada como un duplicado de una pregunta que habla en términos de un paquete. Por lo tanto, el método de espacio de nombres "silencioso" de Joris ni siquiera se usaría, y 'suprimirMensajes()' no hace una supresión completa cuando se usa como el OP indicado. Por lo tanto, de ninguna manera el "duplicado exacto" ayuda a este usuario. – Thell

+0

Gracias, @Thell. Ya leí la publicación identificada cuando hice esta pregunta, así que me alegro de que esté de acuerdo. –

Respuesta

6

Andrew, me encontré con lo mismo y suppressMessages() no quitó toda la producción adicional, pero utilizando sink() en forma de capture.output() envuelto alrededor de los suppressMessages() obras.

$ rscript --vanilla -e 'library(Rmpfr)' 
Loading required package: methods 
Loading required package: gmp 
---->8---- 
Loading C code of R package 'Rmpfr': GMP using 32 bits per limb 
---->8---- 


$ rscript --vanilla -e 'suppressMessages(library(Rmpfr))' 
Loading C code of R package 'Rmpfr': GMP using 32 bits per limb 


$ rscript --vanilla -e 'msg.out <- capture.output(suppressMessages(library(Rmpfr)))' 

¿Qué está pasando al cargar el paquete es Rmpfr varios mensajes de inicio de buen comportamiento escritos utilizando la conexión message junto con un mensaje no tan agradable de utilizar la conexión output. Claro, podría crear y manipular un sink() por su cuenta, pero eso es lo que capture.output() ya está configurado para hacer.

establecer Tal vez un arg detallado para conseguir un poco más de control sería útil ::

$ cat sample.R 
#!/c/opt/R/R-2.15.0/bin/rscript --vanilla 

cmd_args <- commandArgs(TRUE); 

if(length(cmd_args) > 0) { 
    eval(parse(text = cmd_args[1])) 
} 

if(exists("verbose")) { 
    library(Rmpfr) 
} else { 
    msg.trap <- capture.output(suppressMessages(library(Rmpfr))) 
} 

print("Hello") 

que produce ::

$ ./sample.R 
[1] "Hello" 


$ ./sample.R "verbose=TRUE" 
Loading required package: methods 
Loading required package: gmp 

Attaching package: 'gmp' 
---->8---- 
[1] "Hello" 

Un montón de cosas que podrían jugar con allí, pero al al menos puedes ver cómo suprimir totalmente la salida de msg.

Espero que ayude. ¡Que te diviertas!

+0

Parece que va a ser la solución. Debería haber agregado que mi secuencia de comandos principal fuentes cuatro otros para empezar, y que las declaraciones 'library()' están todas en estos scripts auxiliares. Aún así, envolviendo las llamadas 'source()' en 'capture.output (suppressMessages())' casi funciona ... ahora, solo tengo una línea de salida 'character (0)' para cada 'fuente() 'llama antes de la salida deseada. ¿Alguna idea de lo que podría ser? Muchas gracias de todos modos! –

+0

Ahí está: simplemente usando 'repressMessages()' sin 'capture.output()' resuelve todo el problema. ¡Gracias de nuevo! –

+1

La razón por la que recibió un 'carácter (0)' es que no asignó la salida capturada a nada, por lo que se imprimió y en su caso particular todo el mensaje ya había sido suprimido.Tenga en cuenta que 'suprpressMessages()' por sí mismo no siempre le dejará una matriz de caracteres vacía; al igual que con el segundo comando de ejemplo anterior, donde Rmpfr escupe un mensaje de inicialización incluso después de usar 'suprimirMensajes()'. – Thell

Cuestiones relacionadas