在R中抑制C警告信息

7
我正在从与libsvm(一个C程序)接口的R包e1071中调用一个R函数。此函数将C(printf)警告消息传递到R控制台。我知道这是因为警告消息的格式为(warning:...),而R警告消息是大写字母(即Warning:...)。
我已经尝试了所有方法来消除R中的这些消息(sink,suppressWarnings,invisible),但似乎没有任何作用。
有什么想法?
谢谢!

为什么这么模糊?你是通过R包与libsvm进行接口交互吗?还是在开发自定义工具?GCC是一个编译器,我怀疑运行时警告不是来自它,更可能是libsvm C代码中的printf。 - Mark
是的,e1071包 - 我认为你是对的,这些消息来自printf语句。我需要进入C代码并将其删除吗?还是我可以从R中做些什么? - Michael
我也不记得在我的机器上安装过libsvm,我只是下载了R包。这是否意味着libsvm的源代码在R包中? - Michael
我认为这与你最近的问题以及你其他最近的问题有关。尽量将它们放在同一个地方。 - nograpes
如果有帮助的话,打印消息的代码位于e1071软件包源文件中的src/svm.cpp文件中。 - Josh O'Brien
1个回答

11
该函数使用 stdio 而不是 Rprintf/REprintf 或 warning,这就是为什么重定向 R 输出无法正常工作的原因。正确的解决方案是修复 libsvm 中的调用,改用 R 输出。
黑客攻击 stdio 输出是可能的 - 您可以将输出重定向到自己的管道并对其进行处理,但是 a) 这需要在 C 中进行一些工作,b) 这很危险,因为你需要在完成函数后恢复标准行为,即使它出错了,并且 c) 如果在 shell 上使用,它可能会与 R 输出交互。
如果您想要一个真正疯狂、肮脏但快速的解决方案,请在 multicore 中使用 collect(parallel(..., silent=TRUE))[[1]] 运行您的函数 - 它抑制了 stdout(如果您想抑制 stderr,可以添加 multicore:::closeStderr())。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接