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
首先抑制消息?
這是我剛剛碰巧不知道的預期行爲嗎?
我它規定的文件中注意到'suppressMessages評估其表達在忽略所有的「簡單」的診斷messages.'一個方面,我不知道的關鍵術語這裏是*簡單* ... – Lyngbakr
如果你手動調用'print',而不是讓解釋器爲你處理,然後'suppressMessages'確實抑制消息。 'suppressMessages(print(ggplot(Orange,aes(x = age,y = Tree))+ geom_density_ridges()))'有一次,我更好地理解了這個過程(消息如何傳遞以及如何使用suppressMessages以及所有這些)但我早已遺忘了一些細節,所以期待着解釋「爲什麼」的實際迴應。 – Dason
@Dason我想你明白了。只有在對象上調用print()後纔會生成消息。如果你只是在R控制檯中輸入一個變量,R隱式地調用該對象上的print()並顯示結果。如果你運行'supressMessages(ggplot(...))',這與'print(supressMessages(ggplot(...)))'是一樣的,並且在構建過程中不會生成消息。您需要'supressMessages(print(ggplot(...)))'在打印過程中使這些消音。 – MrFlick