2012-01-12 8 views
6

Sto chiamando una funzione R dal pacchetto R e1071 che è interfacciata con libsvm (un programma C). Questa funzione sta passando messaggi di avvertimento C (printf) alla console R. Lo so perché i messaggi di avviso sono nella forma (attenzione: ...) mentre i messaggi di avviso R sono in maiuscolo (ad es. Avviso: ...).Sopprimi messaggi di avviso C in R

Ho provato di tutto per sbarazzarsi di questi messaggi in R (sink, sopprimi avvisi, invisibile) ma nulla sembra funzionare.

Qualche idea?

Grazie!

+0

Perché così vago? Ti stai collegando a libsvm tramite un pacchetto R? O stai lavorando su qualcosa di personalizzato? GCC è un compilatore, dubito che gli avvisi di runtime provengano da esso, più probabilmente sono printfs nel codice C libsvm. – Mark

+0

yep pacchetto e1071 - Penso che tu abbia ragione, i messaggi provengono da una dichiarazione printf. Devo andare nel codice C ed eliminarlo? o c'è qualcosa che posso fare da R? – Michael

+0

anche io non ricordo di aver mai installato libsvm sulla mia macchina, ho appena scaricato il pacchetto R. Significa che il codice sorgente di libsvm si trova nel pacchetto R? – Michael

risposta

9

la funzione utilizza stdio anziché Rprintf/REprintf o warning motivo per cui ri-direzione dell'uscita R non funzionerà. La soluzione corretta è quella di correggere le chiamate in libsvm per utilizzare invece l'output R.

Hacking l'uscita stdio è possibile - è possibile reindirizzare l'output per il proprio tubo e fare quello che vuoi con esso, ma a) si tratta di un po 'di lavoro in C e B) è pericoloso perché è necessario per ripristinare il comportamento standard dopo aver finito con la funzione - anche se errori out e c) in potrebbe interagire con l'output R se usato su una shell.

Se si desidera una soluzione rapida ma sporca davvero sgargianti, eseguire la funzione in collect(parallel(..., silent=TRUE))[[1]] da multicore - sopprime stdout (è possibile aggiungere multicore:::closeStderr() se si vuole sopprimere stderr pure).