2012-02-25 14 views
9

यदि अन्यथा निर्माण और फ़ंक्शन ifelse() अलग-अलग व्यवहार क्यों करते हैं?if-else बनाम ifelse सूचियों के साथ

mylist <- list(list(a=1, b=2), list(x=10, y=20)) 

l1 <- ifelse(sum(sapply(mylist, class) != "list")==0, mylist, list(mylist)) 

l2 <- 
if(sum(sapply(mylist, class) != "list") == 0){ # T: all list elements are lists 
    mylist 
} else { 
    list(mylist) 
} 

all.equal(l1,l2) 
# [1] "Length mismatch: comparison on first 1 components" 

उत्तर

11

if ( cond) { yes } else { no } एक नियंत्रण संरचना है। यह अनुक्रम को संसाधित करने के बजाए प्रोग्रामिंग कांटे को प्रभावित करने के लिए डिज़ाइन किया गया था। मुझे लगता है कि बहुत से लोग एसपीएसएस या एसएएस से आते हैं जिनके लेखकों ने अपने डेटा या ट्रांसफॉर्म कार्यों के भीतर सशर्त असाइनमेंट को लागू करने के लिए "आईएफ" चुना है और इसलिए वे उम्मीद करते हैं कि आर समान व्यवहार करे, जबकि आर प्रोग्रामिंग परंपरा से आया। आर के निहित फॉर-लूप कई वेक्टरीकृत कार्यों (ifelse सहित) में बनाए गए हैं।

ifelse एक अभिव्यक्ति लेता है जो तार्किक मानों का एक वेक्टर बनाता है जो इसके पहले तर्क के रूप में होता है। दूसरे और तीसरे तर्कों को बराबर लंबाई के वैक्टर होने की आवश्यकता होती है और उनमें से पहला या दूसरा चुना जाता है। यह एसपीएसएस/एसएएस IF कमांड के समान है जिसमें ऑपरेशन के एक अंतर्निहित बाय-मोड मोड हैं।

12

ifelse प्रलेखन से:

‘ifelse’ returns a value with the same shape as ‘test’ which is 
filled with elements selected from either ‘yes’ or ‘no’ depending 
on whether the element of ‘test’ is ‘TRUE’ or ‘FALSE’. 

तो अपने इनपुट लंबाई एक तो उत्पादन लंबाई 1.

को छोटा किया गया है आप भी इस एक और अधिक सरल उदाहरण के साथ सचित्र देख सकते हैं:

ifelse(TRUE, c(1, 3), 7) 
# [1] 1 
+1

+1। मुझे आश्चर्य है कि इस डिजाइन के निर्णय के पीछे क्या है ... – Ryogi

+0

@Dason, एक असंबंधित नोट पर, यदि कहता है कि मेरे पास यह 'df.stats $ Mean.Result2 <- ifelse ((df.stats $ t.test.equal <= 0.05 और df.stats $ f.test> 0.05 और df.stats $ Mean.डिफ <0), "धीमी", 0) ' क्या इसका उपयोग करने के लिए इसे लिखने का एक वैकल्पिक तरीका है - अन्यथा निर्माण? अगर इज़ेलसे का प्रदर्शन करता है तो निर्माण के अन्य भाग –

0

किसी कारण से इस Why does ifelse() return single-value output?

का डुप्लिकेट के रूप में चिह्नित किया जाता है तो उस प्रश्न के लिए चारों ओर एक काम है:

a=3 
yo <- ifelse(a==1, 1, list(c(1,2))) 
yo[[1]] 
संबंधित मुद्दे