2012-01-12 3 views
6

Я вызываю функцию R из пакета R e1071, который сопряжен с libsvm (программа C). Эта функция передает предупреждающие сообщения C (printf) в консоль R. Я знаю это, потому что предупреждающие сообщения имеют форму (предупреждение: ...), тогда как предупреждающие сообщения R заглавные (т. Е. Предупреждение: ...).Предупреждающие сообщения C в R

Я пробовал все, чтобы избавиться от этих сообщений в R (раковина, suppressWarnings, невидимая), но ничего не работает.

Любые идеи?

Спасибо!

+0

Почему так расплывчато? Вы взаимодействуете с libsvm через пакет R? Или вы работаете над чем-то обычным? GCC - это компилятор, я сомневаюсь, что из него появляются предупреждения, скорее всего, они являются printfs в коде libsvm C. – Mark

+0

yep e1071 package - Я думаю, что вы правы, сообщения поступают из инструкции printf. Нужно ли мне войти в код C и удалить его? или я могу что-то сделать с R? – Michael

+0

также я не помню, когда-либо устанавливал libsvm на своей машине, я только что загрузил пакет R. Означает ли это, что исходный код libsvm находится в пакете R? – Michael

ответ

9

Функция использует STDIO вместо Rprintf/REprintf или warning поэтому повторное направление выхода R не будет работать. Правильное решение - исправить вызовы в libsvm, чтобы вместо этого использовать R-выход.

Взлом выход STDIO возможно - вы можете перенаправить вывод в вашей собственной трубы и делать то, что вы хотите с ним, но а) это немного работы в С и б) это опасно, потому что вам нужно для восстановления стандартного поведения после того, как вы закончите работу с функцией, даже если это ошибка, и c) внутри может взаимодействовать с выходом R, если он используется в оболочке.

Если вы хотите действительно юродивый, грязный еще быстрое решение, запустить функцию в collect(parallel(..., silent=TRUE))[[1]] от multicore - он подавляет стандартный вывод (вы можете добавить multicore:::closeStderr() если вы хотите, чтобы подавить STDERR а).

Смежные вопросы