2013-09-10 11 views
22

जारी नहीं करता है मुझे पता है कि sink() फ़ंक्शन का उपयोग आर आउटपुट को फ़ाइल में बदलने के लिए किया जा सकता है, उदा।सिंक फ़ाइल

sink('sink-closing.txt') 
cat('Hello world!') 
sink() 

क्या सभी उत्कृष्ट सिंक बंद करने के लिए कोई आसान आदेश है?

नीचे, मैं अपने प्रश्न पर विस्तार से बताता हूं।

मान लीजिए कि मेरी आर-स्क्रिप्ट एक आर-स्क्रिप्ट में sink() खोलती है, लेकिन आर-स्क्रिप्ट में कोई त्रुटि होती है जो स्क्रिप्ट से पहले sink() को बंद कर देता है। मैं त्रुटि को ठीक करने की कोशिश कर, कई बार आर-स्क्रिप्ट चला सकता हूं। अंत में, मैं सभी सिंक बंद करना और कंसोल पर प्रिंट करना चाहता हूं। मैं ऐसा कैसे करूं?

अंत में, कंक्रीटेंस के हित में, मैं जिस समस्या का सामना कर रहा हूं उसे स्पष्ट करने के लिए मैं एक MWE प्रदान करता हूं।

सबसे पहले, मैं एक आर-स्क्रिप्ट sink-closing.R लिखता हूं जिसमें इसकी कोई त्रुटि है।

sink('sink-closing.txt') 

foo <- function() { 
    cat(sprintf('Hello world! My name is %s\n', 
       a.variable.that.does.not.exist)) 
} 

foo() 

sink() 

इसके बाद, मैं आर-स्क्रिप्ट कई बार source, का कहना है कि गलती से 3 बार के रूप में मैं खोजने के लिए और बग को ठीक करने का प्रयास करें।

> source('~/Dropbox/cookbook/r-cookbook/sink-closing.R') 
Error in sprintf("Hello world! My name is %s\n", a.variable.that.does.not.exist) : 
    object 'a.variable.that.does.not.exist' not found 

अब, मान लीजिए कि मैं आर-स्क्रिप्ट डिबगिंग कर रहा हूँ और कंसोल के लिए प्रिंट करना चाहते हैं। मैं पहले सिंक को बंद करने के लिए sink() कई बार कॉल कर सकता हूं। अगर मैं इसे 3 बार कॉल करता हूं, तो अंत में मैं कंसोल पर पहले के रूप में प्रिंट कर सकता हूं। लेकिन मुझे कैसे पता चलेगा कि मुझे कितने सिंक बंद करने की ज़रूरत है?

+1

क्या आप 'sink.number' का उपयोग कर सकते हैं? – mnel

उत्तर

28

आप sink.number() का उपयोग करके आपको यह बताने के लिए उपयोग कर सकते हैं कि कितने मोड़ पहले से सेट हैं और फिर sink पर कई बार कॉल करें। यह एक समारोह में डाल आप इस

sink.reset <- function(){ 
    for(i in seq_len(sink.number())){ 
     sink(NULL) 
    } 
} 
+1

मदद फ़ाइल में सभी * दस्तावेज पढ़ने के लिए एक और जीत! :-) –

9

@ mnel की टिप्पणी के आधार पर हो सकता है:

sinkall <- function() { 
    i <- sink.number() 
    while (i > 0) { 
    sink() 
    i <- i - 1 
    } 
} 

सभी खुले डूब बंद हो जाना चाहिए।

डिवाइस और प्लॉट से निपटने पर आपको यह समस्या भी हो सकती है, जहां खुले उपकरणों की संख्या कहीं भी रिपोर्ट नहीं की जाती है। एक अधिक सामान्य मामले के लिए आप इस इस्तेमाल कर सकते हैं:

stopWhenError <- function(FUN) { 
    tryCatch({ 
    while(TRUE) { 
     FUN() 
    } 
    }, warning = function(w) { 
    print("All finished!") 
    }, error = function(e) { 
    print("All finished!") 
    }) 
} 

stopWhenError(sink) # for sink. 
stopWhenError(dev.off) # close all open plotting devices. 

संपादित करें: sink एक चेतावनी नहीं एक त्रुटि तो मैं इतना है कि यह हमेशा के लिए नहीं चलेंगे, ओह कोड संशोधित करने के फेंकता है!

+0

'tryCatch' का उपयोग करने का सुझाव एक अच्छा है। –

23
closeAllConnections() # ......................... 
+4

... अब वे उस लिंक से लिंक क्यों नहीं करेंगे या सिंक सहायता फ़ाइल में इसका उल्लेख क्यों नहीं करेंगे? – Dason

+0

उन्होंने वास्तव में इस तथ्य को छुपाया नहीं कि यह एक प्रकार का कनेक्शन था। और 'कनेक्शन' पृष्ठ का एक लिंक है। तो यह 'शोकनेक्शन' के लिए दो हॉप लिंक होने लगा। –

+7

@Dason - शायद क्योंकि 'closeAllConnections' इस उद्देश्य के लिए उपयोग करने के लिए एक बहुत ही कच्चे उपकरण है, क्योंकि यह खुले अन्य कनेक्शन बंद कर देगा - न कि वर्तमान में खुले' सिंक '। –

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