2012-01-12 17 views
6

Wywołuję funkcję R z pakietu R e1071, który jest połączony z libsvm (program w języku C). Ta funkcja przekazuje komunikaty ostrzegawcze C (printf) do konsoli R. Wiem o tym, ponieważ komunikaty ostrzegawcze mają postać (ostrzeżenie: ...), podczas gdy komunikaty ostrzegawcze R są pisane wielką literą (tj. Ostrzeżenie: ...).Ukrywanie komunikatów ostrzegawczych C w R

Próbowałem wszystkiego, aby pozbyć się tych wiadomości w R (sink, suppressWarnings, invisible), ale nic nie działa.

Wszelkie pomysły?

Dzięki!

+0

Dlaczego tak nieokreślony? Czy łączysz się z libsvm za pomocą pakietu R? A może pracujesz nad czymś niestandardowym? GCC jest kompilatorem, wątpię, aby pochodziły z niego ostrzeżenia o uruchomieniu, bardziej prawdopodobne, że są one printfs w kodzie C libsvm. – Mark

+0

Pakiet yep e1071 - Myślę, że masz rację, wiadomości pochodzą z instrukcji printf. Czy muszę przejść do kodu C i go usunąć? czy jest coś, co mogę zrobić z R? – Michael

+0

również nie pamiętam kiedykolwiek instalacji libsvm na moim komputerze, właśnie pobrałem pakiet R. Czy to oznacza, że ​​kod źródłowy libsvm znajduje się w pakiecie R? – Michael

Odpowiedz

9

Wykorzystuje stdio zamiast Rprintf/REprintf lub warning dlatego ponownie kierunek wyjścia R nie zadziała. Właściwym rozwiązaniem jest naprawienie połączeń w libsvm, aby zamiast tego używać wyjścia R.

Hakowanie wyjścia stdio jest możliwe - możesz przekierować wyjście do własnej rury i zrobić to, co chcesz, ale a) to trochę pracy w C i b) jest to niebezpieczne, ponieważ potrzebujesz przywrócenie standardowego zachowania po zakończeniu działania funkcji - nawet jeśli błędy i c) w interakcji mogą wpływać na wyjście R, jeśli jest używane w powłoce.

Jeśli chcesz naprawdę whacky, brudny jeszcze szybkie rozwiązanie, uruchom funkcję collect(parallel(..., silent=TRUE))[[1]] z multicore - tłumi stdout (można dodać multicore:::closeStderr() jeśli chcesz stłumić stderr również).

Powiązane problemy