2017-10-20 71 views
10

geom_density_ridges包中的包創建了棱線,如果沒有指定帶寬,它會嘗試找到合理的值。然後使用base R message函數報告該值(請參閱https://twitter.com/ClausWilke/status/921363157553172480)。爲什麼ggplot不允許抑制由它的geoms生成的消息?

base R功能suppressMessages功能旨在抑制此類消息。例如,該代碼輸出一條消息:

message('This is a message'); 

而這種代碼輸出什麼:

suppressMessages(message('This is a message')); 

然而,出於某種原因,消息的抑制似乎,嗯,抑制當這GEOM被添加到一個ggplot。下面的代碼仍然產生消息:(具體地, 「Picking joint bandwidth of 319」)

require('ggplot2'); 
require('ggridges'); 
suppressMessages(ggplot(Orange, aes(x=age,y=Tree)) + geom_density_ridges()); 

這是爲什麼? ggplot是否做了一些事情來確保消息通過,而不管用戶的規格如何?或者這實際上是我剛纔不知道的明智行爲?

生成RMarkdown報告時,可以將塊選項message設置爲message=FALSE,該選項可抑制呈現級別的所有消息。既然這是我的用例,我的問題就解決了。

而且作爲ggridges包的作者Claus Wilke建議,您始終可以手動設置bandwidth以避免該消息(https://twitter.com/ClausWilke/status/921361195231215616)。

但是爲什麼不是suppressMessages首先抑制消息?

這是我剛剛碰巧不知道的預期行爲嗎?

+0

我它規定的文件中注意到'suppressMessages評估其表達在忽略所有的「簡單」的診斷messages.'一個方面,我不知道的關鍵術語這裏是*簡單* ... – Lyngbakr

+4

如果你手動調用'print',而不是讓解釋器爲你處理,然後'suppressMessages'確實抑制消息。 'suppressMessages(print(ggplot(Orange,aes(x = age,y = Tree))+ geom_density_ridges()))'有一次,我更好地理解了這個過程(消息如何傳遞以及如何使用suppressMessages以及所有這些)但我早已遺忘了一些細節,所以期待着解釋「爲什麼」的實際迴應。 – Dason

+4

@Dason我想你明白了。只有在對象上調用print()後纔會生成消息。如果你只是在R控制檯中輸入一個變量,R隱式地調用該對象上的print()並顯示結果。如果你運行'supressMessages(ggplot(...))',這與'print(supressMessages(ggplot(...)))'是一樣的,並且在構建過程中不會生成消息。您需要'supressMessages(print(ggplot(...)))'在打印過程中使這些消音。 – MrFlick

回答

3

當您致電ggplot()時,該命令實際上不繪製一個繪圖 - 它會創建一個ggplot對象。只有打印該對象時纔會繪製一個實際繪製的圖形。當您在R控制檯中鍵入表達式時,默認行爲是對結果調用print(),這就是爲什麼它看起來像ggplot()繪製一個圖。

請注意,在創建ggplot對象期間,您所遇到的警告不會發生;它們在打印這個對象時發生。所以,如果你運行

suppressMessages(ggplot(...)) 

這是基本相同

print(suppressMessages(ggplot(...))) 
運行在交互模式v當

。但是由於ggplot()沒有生成消息,所以沒有任何東西被抑制,並且當打印結果對象時這些消息仍然出現。要抑制在打印期間創建的消息,您需要用suppressMessages()包裝實際的print()聲明。

suppressMessages(print(ggplot(...))) 
相關問題