आर

2010-12-05 12 views
47

में डू-लूप लूप मैं सोच रहा था कि डू-टाइम-स्टाइल लूप कैसे लिखना है?आर

मैं this post पाया:

आप फिर से {} का उपयोग करें और का उपयोग कर जहाँ की स्थिति देख सकते हैं() और बाहर निकलें "तोड़ने" नियंत्रण शब्द के साथ पाश।

मुझे यकीन नहीं है कि इसका क्या अर्थ है। क्या कोई इसे विस्तृत कर सकता है अगर आप इसे समझते हैं और/या यदि आपके पास कोई अलग समाधान है?

+2

@ जेरिको और @ डीविन के उत्तरों के बीच का अंतर "बयान" मूल्यांकन के गीले में है। @ जेरिको के जवाब में, लूप कम से कम एक बार चलाया जाता है क्योंकि ब्रेक हालत "बयान" के बाद आता है। @ डीविन के जवाब में, यदि 'y' 5 से अधिक या बराबर से शुरू हुआ, तो लूप बिल्कुल नहीं चल पाएगा। जो आप पसंद करते हैं उस पर निर्भर करेगा कि क्या आप "कथन" को चलाने के लिए चाहते हैं या नहीं। –

+0

निष्कर्ष में एक कथन कम से कम एक बार चलाता है तो बयानों पर वापस लूप करने से पहले स्थिति की जांच करता है। –

+0

इसलिए, आप डू-लूप लूप के बजाए थोड़ी देर लूप का उपयोग कर सकते हैं, यदि आप सुनिश्चित करते हैं कि लूप (कथन) कम से कम एक बार लूप से पहले स्थिति को सत्य बनाकर चलाया जाता है (उदाहरण के लिए, एक टेम्पोरैरे चर के साथ और एक या कनेक्टिविटी या) जैसा कि डविन के जवाब में)। – Henrik

उत्तर

77

सुंदर आत्म व्याख्यात्मक।

repeat{ 
    statements... 
    if(condition){ 
    break 
    } 
} 

या ऐसा कुछ मुझे लगता है। लूप के दौरान करने के प्रभाव को प्राप्त करने के लिए, बस कथन के समूह के अंत में अपनी हालत की जांच करें।

+0

क्या यह उपयोग करने से तेज़ है? – Emer

+1

कुछ मामलों के लिए थोड़ी देर और एक काम किया जाता है। बस इस तरह से विचार करें, जबकि -> 0 कई बार निष्पादन, कई बार निष्पादन के लिए 1 करें। मैं इसे तेज़ या धीमे के रूप में नहीं देखूंगा, कभी-कभी कभी-कभी आप कम से कम एक बार निष्पादन करना चाहते हैं और कुछ जो आप नहीं करते हैं। यह स्थिति की नियुक्ति से ज्यादा कुछ नहीं है। –

+2

मेरे लिए, 42 का जवाब सच है जबकि साल्सेडो का जवाब झूठा है। 42 के जवाब में, इस स्थिति में एक निगमन है ('दोहराना ({अभिव्यक्ति}; अगर (! End_cond_expr) {break})')। तो, Do-while EndCondition दोहराने के द्वारा अनुकरण किया जाता है! EndCondition। मैंने इस तथ्य को कोड स्निपेट के माध्यम से चेक किया। –

16

?Control देखें या R Language Definition:

> y=0 
> while(y <5){ print(y<-y+1) } 
[1] 1 
[1] 2 
[1] 3 
[1] 4 
[1] 5 

तो do_while आर में एक अलग निर्माण के रूप में मौजूद नहीं है, लेकिन आप नकली इसके साथ कर सकते हैं:

repeat({ expressions}; if (! end_cond_expr) {break}) 

आप मदद पृष्ठ को देखने के लिए चाहते हैं आप कंसोल पर ?while या ?repeat टाइप नहीं कर सकते हैं, बल्कि ?'repeat' या ?'while' का उपयोग करने की आवश्यकता है। if समेत सभी "नियंत्रण-संरचनाएं" एक ही पृष्ठ पर हैं और सभी को "?" के बाद उद्धरण वर्ण की आवश्यकता है इसलिए दुभाषिया उन्हें अपूर्ण कोड के रूप में नहीं देखता है और आपको निरंतरता "+" देता है।

+3

यह "जबकि-डू" है, अनुरोध नहीं किया गया "डू-टाइम"। मुद्दा यह है कि कार्य-समय सेटअप आपको कुछ स्थानों को एक ही स्थान पर लिखने देगा (लूप ब्लॉक के बाहर और अंदर दोहराया नहीं गया) और गारंटी देता है कि इच्छित फ़ंक्शन को एक बार बुलाया जाता है। जैसा कि इस उत्तर में, आप देखते हैं कि दो लाइनें हैं जो 'y' (पहली पंक्ति में और 'प्रिंट' कॉल के भीतर भी मान निर्दिष्ट करती हैं। अनावश्यकता को कम करने और कुछ स्थितियों में बग को कम करने के लिए, यह करना अच्छा होता है इस बीच आप केवल कुछ चर (उदाहरण के लिए 'y') असाइन करते हैं। – Kalin

+0

मुझे उलझाने के लिए क्षमा करें, लेकिन जो भी आप लिखते हैं वह प्रकाश के उदाहरण के बिना अपारदर्शी है। –

+0

कुंजी तब होती है जब समाप्ति की स्थिति निष्पादित होती है। डू-टाइम-लूप में प्रत्येक पुनरावृत्ति के साथ आगे बढ़ने से पहले सच्चाई के लिए स्थिति का परीक्षण किया जाता है, जबकि दोहराव-तक-लूप में परीक्षण पुनरावृत्तियों के अंत में आयोजित किया जाता है और जब एक वास्तविक मूल्य देखा जाता है तो बाहर निकलता है। –

5

अन्य उत्तरों पर बिल्डिंग, मैं थोड़ी देर के व्यवहार को प्राप्त करने के लिए जबकि लूप निर्माण का उपयोग करने का एक उदाहरण साझा करना चाहता था। थोड़ी सी स्थिति (TRUE के लिए आरंभ) में एक साधारण बूलियन वैरिएबल का उपयोग करके, और फिर बाद में अगर कथन में हमारी वास्तविक स्थिति की जांच कर रहा है। कोई भी < जारी रखने के बजाय ब्रेक कीवर्ड का उपयोग कर सकता है - अगर कथन (शायद अधिक कुशल) के अंदर गलत है।

df <- data.frame(X=c(), R=c()) 
    x <- x0 
    continue <- TRUE 

    while(continue) 
    { 
    xi <- (11 * x) %% 16 
    df <- rbind(df, data.frame(X=x, R=xi)) 
    x <- xi 

    if(xi == x0) 
    { 
     continue <- FALSE 
    } 
    } 
0

कि उपयोगकर्ता 42-सही दृष्टिकोण देखकर {
* "जबकि है"
* कोड तुल्यता "नहीं जब तक दोहराने" =:

do while (condition) # in other language 
..statements.. 
endo 

repeat{ # in R 
    ..statements.. 
    if(! condition){ break } # Negation is crucial here! 
} 

} किया दूसरों से पर्याप्त ध्यान नहीं मिलता है, मैं एक ठोस उदाहरण के माध्यम से जोर देता हूं और अपना दृष्टिकोण आगे बढ़ाता हूं। यदि कोई व्यक्ति समय-समय पर (! या अस्वीकृति लेकर) की स्थिति को अस्वीकार नहीं करता है, तो कोड के पाठ्यक्रम के आधार पर विकृत स्थितियां (1. मूल्य दृढ़ता 2. अनंत लूप) मौजूद हैं।

गॉस में:

proc(0)=printvalues(y); 
DO WHILE y < 5;  
y+1; 
y=y+1; 
ENDO; 
ENDP; 
printvalues(0); @ run selected code via F4 to get the following @ 
     1.0000000 
     2.0000000 
     3.0000000 
     4.0000000 
     5.0000000 

आर में:

printvalues <- function(y) { 
repeat { 
y=y+1; 
print(y) 
if (! (y < 5)) {break} # Negation is crucial here! 
} 
} 
printvalues(0) 
# [1] 1 
# [1] 2 
# [1] 3 
# [1] 4 
# [1] 5 

मैं अभी भी जोर देते हैंdo-थोड़ी देर में हालत का निषेध के बिना, साल्सेडो के जवाब गलत है।कोई उपर्युक्त कोड में अस्वीकृति प्रतीक को हटाकर इसे देख सकता है।

+1

मुझे लगता है कि आप साल्सेडो के जवाब को गलत समझ रहे हैं।छद्म कोड में इसकी कोई स्पष्ट स्थिति नहीं है। आप '' (y <5) 'के साथ अपनी' (शर्त) 'को प्रतिस्थापित कर सकते हैं या आप इसे '(y> = 5)' या उपयोग के मामले के लिए जो कुछ भी चाहते हैं उसे प्रतिस्थापित कर सकते हैं। इसमें एक निषेध प्रतीक नहीं है, यह सिर्फ लूप को रोकने के लिए तार्किक स्थिति की आवश्यकता है। – matt

+0

नहीं, मुझे गलत समझ नहीं आती है। मैं जो जोर देता हूं वह यह है कि निर्दिष्ट स्थिति की "अस्वीकृति" का उपयोग किया जाना चाहिए। Math'ly, '! (वाई <5)' and '(y> = 5)' बराबर हैं। दोनों '(वाई <5) 'की अस्वीकृति हैं। मैं "!" के उपयोग पर जोर नहीं देता अस्वीकृति प्रतीक कोई भी नकारात्मक प्रतीक को हाथ में वाक्यांश के रूप में वितरित कर सकता है जैसे कि!! (Y <5)' = '(y> = 5) '। –