2017-10-20 18 views
10

geom_density_ridgesggridges पैकेज से geom ने ridgelines बनाई, और यदि बैंडविड्थ निर्दिष्ट नहीं है, तो यह एक समझदार मान खोजने का प्रयास करता है। यह उस मान की रिपोर्ट करने के लिए base आर message फ़ंक्शन का उपयोग करता है (https://twitter.com/ClausWilke/status/921363157553172480 देखें)।ggplot अपने geoms द्वारा उत्पन्न संदेशों को दबाने की अनुमति क्यों नहीं देता है?

base आर फ़ंक्शन suppressMessages फ़ंक्शन ऐसे संदेशों को दबाने के लिए डिज़ाइन किया गया है।

message('This is a message'); 

और यह कोड outputs कुछ भी नहीं:

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 पैकेज के लेखक क्लॉस विल्के के अनुसार, आप संदेश से बचने के लिए मैन्युअल रूप से bandwidth सेट कर सकते हैं (https://twitter.com/ClausWilke/status/921361195231215616)।

लेकिन क्योंsuppressMessages संदेश को पहली बार दबाया नहीं है?

क्या यह अपेक्षित व्यवहार है जिसे मैं अभी नहीं जानता हूं?

+0

मैं प्रलेखन यह कहा गया में देखा 'suppressMessages एक संदर्भ है कि सभी 'सरल' नैदानिक ​​messages.' पर ध्यान नहीं देता में अपनी अभिव्यक्ति का मूल्यांकन करता है मुझे आश्चर्य है अगर कुंजी शब्द यहाँ है * सरल * ... – Lyngbakr

+4

तो आप मैन्युअल रूप से फोन दुभाषिया को आपके लिए उस पर ध्यान देने की बजाय 'प्रिंट' तो 'suppressMessages' संदेशों को दबा देता है। 'suppressMessages (प्रिंट (ggplot (ऑरेंज, एईएस (एक्स = आयु, वाई = ट्री)) + geom_density_ridges()))' एक बिंदु पर मैंने इस प्रक्रिया को थोड़ा बेहतर समझा (कैसे संदेशों को पारित किया गया और कैसे दबाने का काम करता है और यह सब कुछ) लेकिन मैं लंबे समय से कुछ विवरण भूल गया हूं इसलिए 'क्यों' समझाते हुए एक वास्तविक प्रतिक्रिया की उम्मीद कर रहा हूं। – Dason

+4

@Dason मुझे लगता है कि आपको यह मिला है। जब तक आप ऑब्जेक्ट पर 'प्रिंट() 'कॉल नहीं करते हैं तब तक संदेश उत्पन्न नहीं होते हैं। यदि आप केवल आर कंसोल में एक चर टाइप करते हैं, तो आर उस वस्तु पर 'प्रिंट() 'को स्पष्ट रूप से कॉल करता है और परिणाम दिखाता है। यदि आप 'supressMessages (ggplot (...)) चलाते हैं, तो यह वास्तव में 'प्रिंट (supressMessages (ggplot (...)) के समान है) और इमारत के दौरान उत्पन्न कोई संदेश नहीं है। प्रिंटिंग के दौरान आपको चुप्पी देने के लिए आपको 'supressMessages (प्रिंट (ggplot (...)) की आवश्यकता है। – MrFlick

उत्तर

3

जब आप ggplot() पर कॉल करते हैं, तो वह आदेश वास्तव में एक साजिश नहीं खींचता है - यह एक ggplot ऑब्जेक्ट बनाता है। केवल जब उस वस्तु को मुद्रित किया जाता है तो वास्तव में एक साजिश खींची जाती है। जब आप आर कंसोल में एक अभिव्यक्ति टाइप करते हैं, तो डिफ़ॉल्ट व्यवहार print() को परिणाम पर कॉल करना है, ऐसा लगता है कि ऐसा लगता है कि ggplot() एक साजिश खींचता है।

ध्यान दें कि जिन चेतावनियों का आप अनुभव कर रहे हैं वे ggplot ऑब्जेक्ट के निर्माण के दौरान नहीं होते हैं; वे इस वस्तु के मुद्रण के दौरान होते हैं। तो अनिवार्य रूप से

print(suppressMessages(ggplot(...))) 

जब इंटरैक्टिव मोड में आर चल रूप में एक ही है कि यदि आप

suppressMessages(ggplot(...)) 

चलाते हैं। लेकिन चूंकि ggplot() द्वारा कोई संदेश उत्पन्न नहीं होता है, इसलिए कुछ भी दबाया नहीं जाता है और परिणामस्वरूप ऑब्जेक्ट मुद्रित होने पर वे संदेश तब भी दिखाई देते हैं। प्रिंटिंग के दौरान बनाए गए संदेशों को दबाने के लिए, आपको के साथ वास्तविक print() कथन को लपेटने की आवश्यकता है।

suppressMessages(print(ggplot(...))) 
संबंधित मुद्दे