Как избежать печати / показа сообщений

Этот вопрос задавался ранее, но ни один из ответов не работает для меня.

Я использую библиотеку rhdf5 от bioconductor.org для чтения файлов HDF5: источник (" http://bioconductor.org/biocLite.R "); biocLite ("rhdf5"); библиотека (rhdf5);

Когда я использую функцию h5read для чтения определенных переменных, которые содержат ссылки, выводится следующее предупреждение:

"Предупреждение: h5read для типа" REFERENCE "еще не реализован. Значения заменены на NA"

(Не отображается красным, как ошибки и предупреждения в RStudio. Просто черным)

Предупреждение в порядке для меня, так как мне не нужны эти ссылки. Но я использую эту функцию для чтения сотен переменных, поэтому мой экран загрязняется этими сообщениями. Например:

a <-h5read(f, "/#Link2#")
Warning: h5read for type 'REFERENCE' not yet implemented. Values replaced by NA's
Warning: h5read for type 'REFERENCE' not yet implemented. Values replaced by NA's

Я перепробовал все предложения, которые нашел (capture.output, suppressMessage/Warning, сток, опции (warn, max.print, show.error.messages):

  1. capture.output(a <- h5read(f, "/#Link2#"), file='/dev/null')
  2. Я тоже пробовал невидимку на всякий случай: invisible(capture.output(a <- h5read(f, "/#Link2#"), file='/dev/null'))
  3. suppressWarnings(suppressMessages(a <- h5read(f, "/#Link2#")))
  4. Я тоже пробовал suppressForeignCheck а также suppressPackageStartupMessages так, на всякий случай
  5. {sink("/dev/null"); a <-h5read(f, "/#Link2#"); sink()}
  6. {options(warn=-1, max.print=1,show.error.messages=FALSE); a <-h5read(f, "/#Link2#") }

Все они продолжают выдавать одни и те же предупреждающие сообщения.

Кто-нибудь знает что-нибудь еще, что я мог бы попробовать, или почему эти вещи не работают?

Как библиотеке удается распечатать сообщения, пропуская все это? Похоже, я что-то не так делаю...

Любая помощь приветствуется.

Так же, как ссылки, это другие посты, которые я использовал:

1 ответ

Решение

Вы должны спросить maintainer("rhdf5") чтобы обеспечить решение - печатать сообщение реже и использовать стандартные R-предупреждения - это сообщение из кода C и использует printf(), а не Rf_warning() или же Rf_ShowMessage() или же Rprintf() / REprintf(),

Вот иллюстрация проблемы

> library(inline)
> fun = cfunction(character(), 'printf("hello world\\n"); return R_NilValue;')
> fun()
hello world
NULL
> sink("/dev/null"); fun(); sink()
hello world
> 

и решение - использовать Rf_warning() генерировать R предупреждений. Пример также иллюстрирует, как запись в выходной поток R через Rprintf() затем позволил бы захватить результат с раковиной.

> fun = cfunction(character(), 'Rf_warning("hello world"); return R_NilValue;')
> x = fun()
Warning message:
In fun() : hello world
> x = suppressWarnings(fun())
> fun = cfunction(character(), 'Rprintf("hello world\\n"); return R_NilValue;')
> sink("/dev/null"); fun(); sink()
>

Ничто из этого не поможет вам напрямую!

ОБНОВЛЕНИЕ сопровождающий обновил код в ветке 'devel' пакета, версия 2.17.2.

Другие вопросы по тегам