का उपयोग करना if, ifelseऔर`if`
यदि आर-गोल्फ-इष्टतम समाधान में बयान बहुत भिन्न हो सकते हैं, तो कई तरीके हैं।
मूल बातें
ifनियंत्रण प्रवाह के लिए है। यह सदिश नहीं है, अर्थात केवल लंबाई की स्थितियों का मूल्यांकन कर सकता है 1. इसके elseलिए (वैकल्पिक रूप से) एक और मूल्य वापस करना होगा।
ifelseएक समारोह है। यह वेक्टरकृत है, और मनमानी लंबाई के मूल्यों को वापस कर सकता है। इसका तीसरा तर्क (दूसरा मूल्य) अनिवार्य है। *
`if`के रूप में एक ही वाक्यविन्यास के साथ एक समारोह है ifelse। यह सदिश नहीं है, और न ही कोई वापसी तर्क अनिवार्य है।
* यह तकनीकी रूप से अनिवार्य नहीं है; ifelse(TRUE,x)ठीक काम करता है, लेकिन यह एक त्रुटि फेंकता है यदि तीसरा तर्क खाली है और स्थिति का मूल्यांकन करता है FALSE। तो यह केवल उपयोग करने के लिए सुरक्षित है यदि आप सुनिश्चित हैं कि स्थिति हमेशा हैTRUE , और यदि यह मामला है, तो आप एक इफ-स्टेटमेंट के साथ भी क्यों परेशान कर रहे हैं?
उदाहरण
ये सभी बराबर हैं:
if(x)y else z # 13 bytes
ifelse(x,y,z) # 13 bytes
`if`(x,y,z) # 11 bytes
ध्यान दें कि elseयदि आप कोड में सीधे तार का उपयोग कर रहे हैं तो आसपास के रिक्त स्थान की आवश्यकता नहीं है:
if(x)"foo"else"bar" # 19 bytes
ifelse(x,"foo","bar") # 21 bytes
`if`(x,"foo","bar") # 19 bytes
अब तक, `if`विजेता के रूप में दिखता है, जब तक कि हमारे पास वेक्टरकृत इनपुट नहीं है। लेकिन उन मामलों के बारे में जहां हम दूसरी स्थिति की परवाह नहीं करते हैं? कहो कि हम केवल कुछ कोड निष्पादित करना चाहते हैं यदि शर्त है TRUE। अकेले कोड की एक पंक्ति के लिए, ifआमतौर पर सबसे अच्छा होता है:
if(x)z=f(y) # 11 bytes
ifelse(x,z<-f(y),0) # 19 bytes
`if`(x,z<-f(y)) # 15 bytes
कोड की कई पंक्तियों के लिए, ifअभी भी विजेता है:
if(x){z=f(y);a=g(y)} # 20 bytes
ifelse(x,{z=f(y);a=g(y)},0) # 27 bytes
`if`(x,{z=f(y);a=g(y)}) # 23 bytes
इस बात की भी संभावना है कि हम किसी अन्य शर्त के बारे में क्या सोचते हैं, और जहाँ हम मान वापस करने के बजाय मनमाने कोड को निष्पादित करना चाहते हैं। इन मामलों में, ifऔर `if`बाइट गिनती में बराबर हैं।
if(x)a=b else z=b # 17 bytes
ifelse(x,a<-b,z<-b) # 19 bytes
`if`(x,a<-b,z<-b) # 17 bytes
if(x){z=y;a=b}else z=b # 22 bytes
ifelse(x,{z=y;a=b},z<-b) # 24 bytes
`if`(x,{z=y;a=b},z<-b) # 22 bytes
if(x)a=b else{z=b;a=y} # 22 bytes
ifelse(x,a<-b,{z=b;a=y}) # 24 bytes
`if`(x,a<-b,{z=b;a=y}) # 22 bytes
if(x){z=y;a=b}else{z=b;a=y} # 27 bytes
ifelse(x,{z=y;a=b},{z=b;a=y}) # 29 bytes
`if`(x,{z=y;a=b},{z=b;a=y}) # 27 bytes
सारांश
ifelseजब आपके पास लंबाई> 1 का इनपुट हो तो उपयोग करें ।
यदि आप कोड की कई पंक्तियों को निष्पादित करने के बजाय एक साधारण मान लौटा रहे हैं, तो `if`फ़ंक्शन का उपयोग करना संभवतः पूर्ण if... elseकथन से कम है ।
यदि आप केवल एक ही मूल्य चाहते हैं TRUE, का उपयोग करें if।
मनमाना कोड निष्पादित करने के लिए, `if`और ifआमतौर पर बाइट गिनती के संदर्भ में समान हैं; मैं ifमुख्य रूप से सलाह देता हूं क्योंकि यह पढ़ना आसान है।