2012-08-07 9 views
9

Powiel możliwe:
R suppress startupMessages from dependencyKorzystając z Rscript, czy istnieje porządny sposób na tłumienie danych nieskryptów?

czytałem o użyciu sink("NUL")/sink("/dev/null"), ale żaden z nich nie został ustalony problem mam. Nawet jeśli ja owinąć library() polecenia w sink("NUL") i sink(), moje wezwanie do Rscript wyjścia wszelkiego rodzaju informacji, nie chcę, aby zobaczyć:

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 

Rzeczy na końcu jest tylko wyjście I rzeczywiście chcą, i także jedyne wyjście, które wydaje się być w stanie tłumić poleceniami sink(). Naprawdę wydaje się, że powinien po prostu być argumentem do Rscript, który pomija to wyjście (które nawet nie pojawia się, jeśli I source mój skrypt w konsoli) ... jakiekolwiek wejście?

+5

może pomóc?? SuppressPackageStartupMessages'? – Chase

+3

Chciałem tylko wspomnieć o zamknięciu jako duplikacie, że pytanie to dotyczy skryptu i jest oznaczane jako duplikat pytania mówiącego w kategoriach pakietu. Tak więc "cicha" metoda przestrzeni nazw przez Joris nie byłaby nawet użyta, a 'suppressMessages()' nie wykonałby pełnego wytłumienia, gdy byłby używany zgodnie z OP. Więc w żaden sposób "dokładny duplikat" nie pomaga temu użytkownikowi. – Thell

+0

Dzięki, @Thell. Przeczytałem już wskazany post, gdy zadałem to pytanie, więc cieszę się, że się zgadzasz. –

Odpowiedz

6

Andrew, wpadłem na to samo i suppressMessages() nie usunąć wszystkie dodatkowe wyjście, ale przy użyciu sink() w postaci capture.output() owinięty wokół suppressMessages() prac.

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

Co dzieje się podczas ładowania pakiet Rmpfr jest kilka dobrze wychowane komunikaty startowe napisane przy użyciu połączenia message wraz z niezbyt miłą wiadomość za pomocą połączenia output. Oczywiście, możesz samodzielnie tworzyć i modyfikować kod sink(), ale to właśnie jest już skonfigurowane. capture.output().

Może ustawienie opisowy Arg się trochę więcej kontroli byłoby pomocne ::

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

co daje ::

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


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

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

Wiele rzeczy można bawić się tam, ale na przynajmniej możesz zobaczyć, jak całkowicie wyłączyć wyjście msg.

Mam nadzieję, że to pomaga. Baw się dobrze!

+0

Wygląda na to, że to będzie rozwiązanie. Powinienem dodać, że mój główny skrypt zawiera cztery inne źródła, a instrukcje 'library()' znajdują się w tych pomocniczych skryptach. Mimo to owijanie wywołań 'source()' w 'capture.output (suppressMessages())' prawie działa ... teraz, mam po prostu linię wyjściową 'character (0)' dla każdego 'źródła() 'wywołania przed żądanym wyjściem. Masz pojęcie, co to może być? Wielkie dzięki! –

+0

Tam: po prostu użycie 'suppressMessages()' bez 'capture.output()' rozwiązuje cały problem. Dzięki jeszcze raz! –

+1

Powodem, dla którego otrzymałeś 'character (0)' jest to, że nie przypisałeś wychwyconych danych wyjściowych do niczego, co zostało wydrukowane, aw twoim przypadku cała wiadomość została już usunięta.Należy pamiętać, że 'suppressMessages()' samo nie zawsze pozostawi Cię z pustą tablicą znaków; podobnie jak w powyższym drugim przykładzie, gdzie Rmpfr wypuszcza komunikat inicjalizacyjny nawet po użyciu 'suppressMessages()'. – Thell

Powiązane problemy