अस्वीकरण: यह कोड खराब अभ्यास है।, और केवल कुछ बग की तरह काम करता है जैसे। इसे वास्तविक स्थिति में कभी भी उपयोग न करें। यह सवाल आर के दिलचस्प व्यवहार के बारे में है, उससे कुछ और नहीं।आर का व्यवहार ifelse का उपयोग करके और संयोजन में eval
this question पढ़ने के बाद मुझे बहुत परेशान हो गया। जाहिर है, ifelse छिपी जानी चाहिए जानकारी तक पहुंच सकते हैं।
हम क्या कहते हैं:
> x <- expression(dd <- 1:3)
> y <- expression(dd <- 4:6)
> z <- c(1,0)
> eval(x)
> eval(y)
>
हम कोई उत्पादन मिलता है। तर्क, क्योंकि दोनों अभिव्यक्ति वास्तव में एक वेक्टर डीडी के असाइनमेंट हैं। eval() तब उत्पादन देना नहीं है। लेकिन आश्चर्यजनक रूप से पर्याप्त है, जब आप अजीब कोड
> ifelse(z==0,eval(x),eval(y))
[1] 4 2
आपको आउटपुट प्राप्त करने का प्रयास करें ??? किसी के पास इसके लिए स्पष्टीकरण है?
यह उतना आसान नहीं है जितना "आर मूल्यांकन करता है और फिर डीडी का उपयोग करता है"। जो भी आदेश आप जेड देते हैं, जो भी स्थिति आप उपयोग करते हैं, डीडी हमेशा अंतिम उल्लिखित eval()
है।
> ifelse(z==0,eval(x),eval(y))
> dd
[1] 4 5 6
> ifelse(z==1,eval(x),eval(y))
> dd
[1] 4 5 6
> z <- c(0,1)
> ifelse(z==0,eval(x),eval(y))
> dd
[1] 4 5 6
> ifelse(z==1,eval(x),eval(y))
> dd
[1] 4 5 6
> ifelse(z==1,eval(y),eval(x))
> dd
[1] 1 2 3
संपादित करें:
ifelse के स्रोत कोड को नज़दीक से देखने से पता चलता है कि लाइन यकीन है कि ऐसा होता है, जिससे rep()
है:
> x <- expression(dd <- 1:3)
> eval(x)
> rep(eval(x),2)
[1] 1 2 3 1 2 3
फिर भी, यह नहीं करता है ' प्रश्न हल नहीं करें ...
* संभावित * eval वापसी अदृश्य वस्तु। – kohske
@koshke: ऐसा लगता है। str (eval (x)) ऑब्जेक्ट देता है। इसे एक उत्तर के रूप में रखो और मैं स्वीकार करूंगा। –