2012-08-07 6 views
9

Eventuali duplicati:
R suppress startupMessages from dependencyUsando Rscript, c'è un modo decente per sopprimere l'output di non script?

Ho letto sull'utilizzo sink("NUL")/sink("/dev/null"), ma nessuno dei due ha risolto il problema che sto avendo. Anche se mi avvolgo i comandi library() in sink("NUL") e sink(), la mia chiamata a rscript uscite tutti i tipi di informazioni che non voglio vedere:

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 

La roba alla fine è l'unica uscita Io in realtà voglio, e anche l'unica uscita che sembro in grado di sopprimere con i comandi sink(). Sembra davvero che ci dovrebbe essere un argomento per Rscript che sopprime questo output (che non compare nemmeno se io I source il mio script nella console) ... qualsiasi input?

+5

forse '? SuppressPackageStartupMessages' aiuterà? – Chase

+3

Volevo solo menzionare riguardo alla chiusura come duplicato che questa domanda sta chiedendo di uno script e viene contrassegnata come un duplicato di una domanda che parla in termini di un pacchetto. Quindi il metodo dello spazio dei nomi 'silenzioso' di Joris non verrebbe nemmeno usato, e 'suppressMessages()' non esegue una soppressione completa se usato come indicato dall'OP. Quindi in nessun caso il 'duplicato esatto' aiuta quest'utente. – Thell

+0

Grazie, @Thell. Avevo già letto il post identificato quando ho fatto questa domanda, quindi sono felice che tu sia d'accordo. –

risposta

6

Andrew, mi sono imbattuto nella stessa cosa e suppressMessages() non ha rimosso tutto l'output aggiuntivo, ma utilizzando sink() nel formatoavvolto intorno al suppressMessages() funziona.

$ 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)))' 

Che cosa sta succedendo quando si carica il pacchetto Rmpfr è diversi messaggi di avvio ben educati scritti utilizzando la connessione message insieme ad un non così bel messaggio utilizzando la connessione output. Certo, potresti creare e manipolare uno sink() da solo, ma questo è ciò che capture.output() è già configurato per fare.

Forse l'impostazione di un arg verbose per ottenere un po 'più di controllo sarebbe utile ::

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

che produce ::

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


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

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

Un sacco di roba che potrebbe giocare con lì, ma a per lo meno puoi vedere come sopprimere completamente l'output del msg.

Spero che aiuti. Divertiti!

+0

Sembra che sarà la soluzione. Avrei dovuto aggiungere che il mio script principale ne fornisce altri quattro all'inizio e che le istruzioni 'library()' sono tutte in questi script ausiliari. Anche così, il wrapping delle chiamate 'source()' in 'capture.output (suppressMessages())' funziona quasi ... ora, ho solo una riga di output 'character (0)' per ciascuno dei 'source() 'chiama prima dell'output desiderato. Qualche idea di cosa potrebbe essere? Grazie mille in ogni caso! –

+0

In questo caso: l'uso di 'suppressMessages()' senza 'capture.output()' risolve l'intero problema. Grazie ancora! –

+1

Il motivo per cui hai ricevuto un 'carattere (0)' è che non hai assegnato l'output catturato a qualcosa in modo che fosse stampato e nel tuo caso particolare l'intero messaggio era già stato soppresso.Si noti che 'suppressMessages()' di per sé non ti lascerà sempre con un array di caratteri vuoto; proprio come con il secondo comando di esempio sopra, dove Rmpfr sputa un messaggio di inizializzazione anche dopo aver usato 'suppressMessages()'. – Thell

Problemi correlati