Подавить предупреждающие сообщения C в R

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

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

Любые идеи?

Спасибо!


person Michael    schedule 12.01.2012    source источник
comment
Почему так расплывчато? Вы взаимодействуете с libsvm через пакет R? Или вы работаете над чем-то нестандартным? GCC - это компилятор, я сомневаюсь, что от него исходят предупреждения во время выполнения, скорее всего, это printfs в C-коде libsvm.   -  person Mark    schedule 13.01.2012
comment
да, пакет e1071 - я думаю, вы правы, сообщения исходят из оператора printf. Нужно ли мне заходить в код C и удалять его? или есть что-то, что я могу сделать из R?   -  person Michael    schedule 13.01.2012
comment
также я не помню, чтобы когда-либо устанавливал libsvm на свою машину, я только что скачал пакет R. Означает ли это, что исходный код libsvm находится в пакете R?   -  person Michael    schedule 13.01.2012
comment
Я думаю, что это связано с вашим недавним вопросом и ваш другой недавний вопрос. Постарайтесь держать их всех в одном месте.   -  person nograpes    schedule 13.01.2012
comment
Если это поможет, код, печатающий сообщения, находится в файле src/svm.cpp в исходниках пакета e1071.   -  person Josh O'Brien    schedule 13.01.2012


Ответы (1)


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

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

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

person Simon Urbanek    schedule 12.01.2012