抑制 R 中的 C 警告消息

Posted

技术标签:

【中文标题】抑制 R 中的 C 警告消息【英文标题】:Suppress C warning messages in R 【发布时间】:2012-02-09 04:25:30 【问题描述】:

我正在从与 libsvm(一个 C 程序)接口的 R 包 e1071 中调用一个 R 函数。此函数将 C (printf) 警告消息传递到 R 控制台。我知道这一点,因为警告消息的形式是(警告:...),而 R 警告消息是大写的(即警告:...)。

我已经尝试了一切来消除 R 中的这些消息(接收器、suppressWarnings、不可见),但似乎没有任何效果。

有什么想法吗?

谢谢!

【问题讨论】:

为什么这么模糊?您是否通过 R 包连接到 libsvm?或者你正在做一些定制的事情? GCC 是一个编译器,我怀疑运行时警告是否来自它,更有可能它们是 libsvm C 代码中的 printfs。 是的 e1071 包 - 我认为你是对的,这些消息来自 printf 语句。我需要进入C代码并删除它吗?或者我可以从 R 做些什么? 我也不记得曾经在我的机器上安装过 libsvm,我只是下载了 R 包。这是否意味着 libsvm 源代码在 R 包中? 我认为这与your recent question和your other recent question有关。尝试将它们都放在同一个地方。 如果有帮助,打印消息的代码位于 e1071 包源中的文件 src/svm.cpp 中。 【参考方案1】:

该函数使用 stdio 而不是 Rprintf/REprintfwarning,这就是 R 输出重定向不起作用的原因。正确的解决方案是修复 libsvm 中的调用以使用 R 输出。

破解 stdio 输出是可能的 - 你可以将输出重定向到你自己的管道并用它做你想做的事,但是 a)它在 C 中有点工作,b)它是很危险,因为您需要在使用完函数后恢复标准行为 - 即使它出错,并且 c) in 如果在 shell 上使用可能会与 R 输出交互。

如果你想要一个非常古怪、肮脏但快速的解决方案,请在 collect(parallel(..., silent=TRUE))[[1]] 中从 multicore 运行你的函数 - 它会抑制 stdout(如果你想抑制 ,可以添加 multicore:::closeStderr() em>stderr 也是如此)。

【讨论】:

以上是关于抑制 R 中的 C 警告消息的主要内容,如果未能解决你的问题,请参考以下文章

C#:有啥方法可以抑制编译器错误,类似于抑制警告消息?

foreach (R):抑制从全局环境加载的包中的消息

正确抑制数据表中的警告?

抑制一行中的多个警告?

有没有办法抑制 Xcode 中的警告?

导入模块时抑制 scapy 警告消息