2012-01-12 123 views
6

我正在與libsvm(C程序)接口的R軟件包e1071中調用R函數。該函數將C(printf)警告消息傳遞給R控制檯。我知道這是因爲警告消息的形式(警告:...),而R警告消息是大寫(即警告:...)。禁止R中的C警告消息

我已經試過一切擺脫R(水槽,suppressWarnings,隱形)這些消息,但似乎沒有任何工作。

任何想法?

謝謝!

+0

爲什麼這麼模糊?你是否通過R包與libsvm連接?或者你在做什麼定製? GCC是一個編譯器,我懷疑運行時警告來自它,更可能是libsvm C代碼中的printfs。 – Mark 2012-01-12 21:32:44

+0

yep e1071包 - 我認爲你是對的,這些消息來自printf語句。我需要進入C代碼並刪除它嗎?或者我可以從R做些什麼? – Michael 2012-01-12 21:35:27

+0

我也不記得在我的機器上安裝libsvm,我只是下載了R包。這是否意味着libsvm源代碼位於R包中? – Michael 2012-01-12 21:37:07

回答

9

該函數使用STDIO代替Rprintf/REprintfwarning這就是爲什麼R輸出的重新定向將不起作用。正確的解決方案是修復libsvm中的調用以替代使用R輸出。

黑客入侵STDIO輸出是可能的 - 你可以重新直接輸出到您自己的管道,做你想要做什麼用,但)它在C多的工作和b)這是危險的,因爲你需要在完成該功能後恢復標準行爲 - 即使它出錯並且c)in可能與R輸出交互(如果在shell上使用)。

如果你想要一個真正怪誕的,髒又快速的解決方案,從multicore運行collect(parallel(..., silent=TRUE))[[1]]的功能 - 它抑制標準輸出(你可以添加multicore:::closeStderr()如果要抑制標準錯誤爲好)。