2010-09-10 7 views
8

आर में कुछ फ़ंक्शन जानकारी प्रिंट कर सकते हैं और मान वापस कर सकते हैं, क्या प्रिंट चुप हो सकता है?क्या आर में प्रिंट() कमांड शांत हो सकता है?

उदाहरण के लिए:

print.and.return <- function() { 
    print("foo") 
    return("bar") 
} 

रिटर्न

> print.and.return() 
[1] "foo" 
[1] "bar" 
> 

मैं की तरह वापसी स्टोर कर सकते हैं:

> z <- print.and.return() 
[1] "foo" 
> z 
[1] "bar" 
> 

मैं "foo" के प्रिंट को दबाने कर सकते हैं?

+4

प्रश्न

print.and.return2 <- function() { message("foo") invisible("bar") } 

चीयर्स आप एक बहुत गंदा तरह से कुछ कर रहे हैं ... – mbq

+0

पी का सुझाव रॉबलेम यह है कि यह मेरा काम नहीं है जो प्रिंटिंग और लौट रहा है, आयातित लाइब्रेरी में डाइविंग से छोटा, मैं आउटपुट को शांत करना चाहता हूं। – ayman

उत्तर

7

आप समारोह

deprintize<-function(f){ 
return(function(...) {capture.output(w<-f(...));return(w);}); 
} 
को परिभाषित करते हुए आर की छिपी कार्यात्मक प्रकृति, उदाहरण के लिए उपयोग कर सकते हैं

कि 'चुप' लोगों के 'मुद्रण' कार्यों में परिवर्तित कर देंगे:

noisyf<-function(x){ 
print("BOO!"); 
sin(x); 
} 

noisyf(7) 
deprintize(noisyf)(7) 
deprintize(noisyf)->silentf;silentf(7) 
+0

' शांत 'उस फ़ंक्शन के लिए बेहतर नाम हो सकता है ... – hadley

+3

@ हडली उबाऊ! – mbq

9
?capture.output 
+0

अच्छा, तो मेरे उदाहरण में: dev.nil <- capture.output (z <- print.and.return()) चाल करता है। – ayman

3

यदि आपको अपने कार्यों में प्रिंटिंग के दुष्प्रभाव की पूरी आवश्यकता है, तो इसे एक विकल्प क्यों न दें?

print.and.return <- function(..., verbose=TRUE) { 
    if (verbose) 
    print("foo") 
    return("bar") 
} 


> print.and.return() 
[1] "foo" 
[1] "bar" 
> print.and.return(verbose=FALSE) 
[1] "bar" 
> 
+0

डिफ़ॉल्ट का अच्छा उपयोग; मुद्दा यह है कि यह मेरा काम नहीं है। – ayman

+0

कई मामलों में जहां आप ऐसा करेंगे, आपको शायद प्रिंट के बजाय 'संदेश' का उपयोग करना चाहिए। (यानी, उन मामलों में जहां आपकी '"foo" 'एक आर ऑब्जेक्ट की बजाय एक स्ट्रिंग है जिसके लिए आप प्रिंट विधि का उपयोग करना चाहते हैं।) – Gregor

3

मैं सहमत हूं सबसे सामान्य समाधान के रूप में capture.output के हैडली और एमबीक्यू के सुझाव के साथ। आपके द्वारा लिखे गए कार्यों के विशेष मामले के लिए (यानी, जहां आप सामग्री को नियंत्रित करते हैं), print के बजाय message का उपयोग करें। इस तरह आप suppressMessages के साथ आउटपुट को दबा सकते हैं।

print.and.return2 <- function() { 
    message("foo") 
    return("bar") 
} 

# Compare: 
print.and.return2() 
suppressMessages(print.and.return2()) 
1

मुझे पता है कि मैं इस पोस्ट को पुनर्जीवित कर सकता हूं लेकिन किसी और को यह मिल सकता है जैसा मैंने किया था। मैं अपने कार्यों में से एक में एक ही व्यवहार में रुचि थी और मैं सिर्फ "अदर्शन" भर में आया था:

यह return() का एक ही उपयोग किया है, लेकिन यह सिर्फ मान दिया मुद्रित नहीं है:

invisible(variable) 

इस प्रकार, @ayman द्वारा दिए गए उदाहरण के लिए: इस तरह

संबंधित मुद्दे