2017-02-15 9 views
7

RStudio में कोड के ब्लॉक को निष्पादित करते समय निष्पादन वास्तव में कोई त्रुटि होने पर रोक नहीं देता है। उदाहरण के लिए, अगर मैं खुले संपादक में निम्न कोड है:RStudio/इंटरएक्टिव आर सत्र में त्रुटि पर निष्पादन रोकें

x <- 'test' 
stopifnot(is.numeric(x)) 
print('hello world') 

और इसे चलाने के (या तो आदेश-वापसी के साथ या "रन" बटन पर क्लिक करके), यह त्रुटि प्रिंट लेकिन फिर पर और कार्यान्वित जुलूस प्रिंट स्टेटमेंट

क्या त्रुटि से पहले आगे बढ़ने के लिए RStudio को कॉन्फ़िगर करने का कोई तरीका नहीं है? यानी इसे उपरोक्त पंक्ति 2 पर रोकें और प्रिंट स्टेटमेंट पर आगे बढ़ें?

संपादित करें: बस यह एहसास हुआ कि अगर मैं मानक आर जीयूआई में कमांड-आर का उपयोग कर कोड भेजता हूं तो यह भी होता है।

+0

यदि आप इसे स्रोत फ़ाइल के रूप में निष्पादित करते हैं, तो यह वही काम करेगा जैसा आप चाहते हैं। यदि आप, उदाहरण के लिए कोड की 3 पंक्तियों को कंसोल में कॉपी और पेस्ट करें और एंटर दबाएं, तो यह कोड की प्रत्येक पंक्ति को अलग से चलाएगा। यह दूसरा मोड संभवतः रन बटन के तहत चल रहा है। – lmo

+1

@ एलएमओ धन्यवाद - समस्या ज्यादातर लोग हैं जिन्हें मैं प्रोग्राम को अंतःक्रियात्मक रूप से जानता हूं। मैं सामाजिक वैज्ञानिकों के लिए उनके कोड में परीक्षण करने के लिए एक ट्यूटोरियल लिखने की कोशिश कर रहा हूं, और उनसे मिलने की जरूरत है जहां वे हैं। –

+0

हमेशा 'tryCatch' और' try' है। – lmo

उत्तर

0

मुझे नहीं लगता कि RStudio को सभी पंक्तियों को चलाने से रोकने का एक तरीका है, जब आप कोई सेक्शन चुनते हैं और Ctrl + Enter दबाते हैं। Rstudio बस एक लाइन के बाद एक लाइन चल रहा है। भले ही stopifnot() किसी फ़ंक्शन के अंदर बुलाया जाता है, फिर भी उस फ़ंक्शन कॉल के बाद की सभी पंक्तियों का मूल्यांकन किया जाएगा।

यदि कुछ लक्ष्य गलत होने पर आपके लक्ष्य को सूचित किया जाना है, तो बहुत सारे कोड व्यर्थ में चलने से पहले, शायद आप stopifnot() के समान फ़ंक्शन को परिभाषित कर सकते हैं जो त्रुटि होने पर बस एक अंतहीन पाश में जायेगा । प्रोग्राम को बाधित करने के लिए आप Esc या RStudio में स्टॉप-बटन दबा सकते हैं। कुछ इस तरह:

waitifnot <- function(cond) { 
    if (!cond) { 
    message(deparse(substitute(cond)), " is not TRUE") 
    while (TRUE) {} 
    } 
} 

अब आप इस समारोह के साथ अपने उदाहरण कोड चला सकते हैं:

x <- 'test' 
waitifnot(is.numeric(x)) 
print('hello world') 

जैसी उम्मीद थी, hello world मुद्रित कभी नहीं किया गया है। आपको एक त्रुटि संदेश मिलेगा, आपको बताएगा कि कुछ गलत हो गया है, और फिर प्रोग्राम तब तक इंतजार करेगा जब तक आप इसे मैन्युअल रूप से निरस्त नहीं करते।

यह इंटरैक्टिव मोड के अलावा किसी भी स्थिति में अच्छी तरह से काम नहीं करेगा। अप्रिय स्थितियों से बचने के लिए, आप भी समारोह अलग प्रतिक्रिया है, अगर यह इस तरह, इंटरैक्टिव मोड में नहीं किया जाता है, उदाहरण के लिए दे सकता है:

waitifnot <- function(cond) { 
    if (!cond) { 
    msg <- paste(deparse(substitute(cond)), "is not TRUE") 
    if (interactive()) { 
     message(msg) 
     while (TRUE) {} 
    } else { 
     stop(msg) 
    } 
    } 
} 

यह समारोह एक अंतहीन लूप केवल यदि इंटरैक्टिव मोड में चलने में जाना जाएगा। अन्यथा, यह stop() पर कॉल करके निष्पादन को रद्द कर देगा। मैंने जांच की है कि यह Ctrl + Enter या RStudio (एंडलेस लूप) में स्रोत बटन और बैश कमांड लाइन (प्रोग्राम के निरस्त) पर Rscript के साथ अपेक्षित कार्य करता है।

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