r - ब्रेक/एक्स्टिट स्क्रिप्ट




exit break (5)

मेरे पास एक प्रोग्राम है जो कुछ डेटा विश्लेषण करता है और कुछ सौ पंक्तियां लंबी है

कार्यक्रम में बहुत पहले से, मैं कुछ गुणवत्ता नियंत्रण करना चाहता हूं और यदि पर्याप्त डेटा नहीं है, तो मैं प्रोग्राम को समाप्त करना और आर कंसोल पर वापस जाना चाहता हूं। अन्यथा, मैं बाकी कोड को निष्पादित करना चाहता हूं।

मैंने break , browser , और quit की कोशिश की है और उनमें से कोई भी अन्य कार्यक्रम के निष्पादन को रोक नहीं सकता (और quit से निष्पादन बंद हो जाता है और पूरी तरह से आर quit रोकता है, जो कि मैं कुछ नहीं करना चाहता हूं)। मेरा आखिरी सहारा नीचे दिए गए एक if-else कथन का निर्माण कर रहा है:

 if(n < 500){}
 else{*insert rest of program here*}

लेकिन यह बुरा कोडिंग अभ्यास की तरह लगता है क्या मैं कुछ भूल रहा हूँ?


अच्छा नहीं है, लेकिन यहां आरआई में एक exit() कमांड को लागू करने का एक तरीका है जो मेरे लिए काम करता है

exit <- function() {
  .Internal(.invokeRestart(list(NULL, NULL), NULL))
}

print("this is the last message")
exit()
print("you should not see this")

केवल हल्के ढंग से परीक्षण किया जाता है, लेकिन जब मैं इसे चलाता हूं, तो मैं देखता हूं कि this is the last message और फिर कोई त्रुटि संदेश के बिना स्क्रिप्ट बंद हो जाती है।


अपने-अन्य निर्माण को उलट करें:

if(n >= 500) {
  # do stuff
}
# no need for else

यदि आप प्रोग्राम को एक त्रुटि उत्पन्न करने के लिए चाहते हैं तो आप stopifnot() फ़ंक्शन का उपयोग कर सकते हैं:

foo <- function(x) {
    stopifnot(x > 500)
    # rest of program
}

यहाँ:

if(n < 500)
{
    # quit()
    # or 
    # stop("this is some message")
}
else
{
    *insert rest of program here*
}

दोनों छोड़ने () और रोक (संदेश) आपकी स्क्रिप्ट छोड़ देंगे यदि आप आर कमांड प्रॉम्प्ट से अपनी स्क्रिप्ट को सोर्स कर रहे हैं, तो बाहर निकलें () आर से भी बाहर निकल जाएगा।


संपादित करें: ओपी एक लंबी लिपि चल रहा है, उस स्थिति में किसी को केवल गुणवत्ता नियंत्रण के बाद स्क्रिप्ट का हिस्सा लपेटने की आवश्यकता होती है

if (n >= 500) {

.... long running code here

}

अगर किसी फ़ंक्शन से बाहर निकलते हैं, तो आप शायद केवल return() चाहते return() , या तो स्पष्ट रूप से या निहित रूप से

उदाहरण के लिए, एक स्पष्ट डबल वापसी

foo <- function(x) {
  if(x < 10) {
    return(NA)
  } else {
    xx <- seq_len(x)
    xx <- cumsum(xx)
  }
  xx ## return(xx) is implied here
}

> foo(5)
[1] 0
> foo(10)
 [1]  1  3  6 10 15 21 28 36 45 55

return() होने के नाते, मेरा मतलब है कि आखिरी पंक्ति ऐसा है जैसे आपने return(xx) , लेकिन return() करने के लिए कॉल छोड़ने के लिए यह थोड़ा अधिक कुशल है।

कुछ सोचते हैं कि कई रिटर्न खराब शैली का इस्तेमाल करते हैं; लंबे फ़ंक्शन में, फ़ंक्शन को बाहर निकलता है, जहां का ट्रैक मुश्किल या त्रुटि प्रवण हो सकता है। अतः वैकल्पिक विकल्प एक एकल रिटर्न पॉइंट है, लेकिन if () else () क्लॉज का उपयोग करके वापसी ऑब्जेक्ट को बदलना है। इस तरह के संशोधन को foo() होगा

foo <- function(x) {
  ## out is NA or cumsum(xx) depending on x
  out <- if(x < 10) {
    NA
  } else {
    xx <- seq_len(x)
    cumsum(xx)
  }
  out ## return(out) is implied here
}

> foo(5)
[1] NA
> foo(10)
 [1]  1  3  6 10 15 21 28 36 45 55






break