का उपयोग करना 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
मुख्य रूप से सलाह देता हूं क्योंकि यह पढ़ना आसान है।