抑制 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
/REprintf
或 warning
,这就是 R 输出重定向不起作用的原因。正确的解决方案是修复 libsvm
中的调用以使用 R 输出。
破解 stdio 输出是可能的 - 你可以将输出重定向到你自己的管道并用它做你想做的事,但是 a)它在 C 中有点工作,b)它是很危险,因为您需要在使用完函数后恢复标准行为 - 即使它出错,并且 c) in 如果在 shell 上使用可能会与 R 输出交互。
如果你想要一个非常古怪、肮脏但快速的解决方案,请在 collect(parallel(..., silent=TRUE))[[1]]
中从 multicore
运行你的函数 - 它会抑制 stdout(如果你想抑制 ,可以添加 multicore:::closeStderr()
em>stderr 也是如此)。
【讨论】:
以上是关于抑制 R 中的 C 警告消息的主要内容,如果未能解决你的问题,请参考以下文章