2010-12-06 4 views
7

अस्वीकरण: यह कोड खराब अभ्यास है।, और केवल कुछ बग की तरह काम करता है जैसेइसे वास्तविक स्थिति में कभी भी उपयोग न करें। यह सवाल आर के दिलचस्प व्यवहार के बारे में है, उससे कुछ और नहीं।आर का व्यवहार 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 

फिर भी, यह नहीं करता है ' प्रश्न हल नहीं करें ...

+1

* संभावित * eval वापसी अदृश्य वस्तु। – kohske

+0

@koshke: ऐसा लगता है। str (eval (x)) ऑब्जेक्ट देता है। इसे एक उत्तर के रूप में रखो और मैं स्वीकार करूंगा। –

उत्तर

5

यह एक बग नहीं है

कमांड के परिणाम के कंसोल पर 'आउटपुट' सशर्त है। यह समारोह अपने आप में निर्धारित किया जा सकता - उदाहरण के लिए:

> f=function(x)x; 
> g=function(x)invisible(x); 
> f(1) 
[1] 1 
> g(2) 
> .Last.value 
[1] 2 

मूल्य अभी भी ठीक लौटे जा रहा है - यह सिर्फ कंसोल पर मुद्रित नहीं है।

यहाँ क्या हो रहा है eval इसके उत्पादन invisible लेकिन rep और ifelse नहीं चिह्नित करता है, और वास्तव में प्रभावी रूप से invisible संपत्ति उनके इनपुट बंद पट्टी।

ऐसा लगता है कि अदृश्य चर की एक विशेष संपत्ति है, और प्रतिनिधि ऑपरेशन के माध्यम से पारित नहीं किया गया है। यह भी काम के माध्यम से पारित नहीं कर रहा है:

> h=function(x){y=x;y;} 
> f(g(1)) 
> h(g(1)) 
[1] 1 
> 

कुछ अधिक पृष्ठभूमि के लिए ?invisible देखें।

+0

बहुत सही। उदाहरण के लिए Thx भी, मैंने स्पष्ट रूप से 'eval()' फ़ंक्शन पूरी तरह गलत व्याख्या की। –

2

आर हमेशा ifelse कमांड के दो विकल्पों का मूल्यांकन करता है। आप तर्कसंगत बना सकते हैं कि प्रत्येक वेक्टर में कौन सा आइटम कॉलिंग पर्यावरण पर वापस जाने के लिए चुनने के लिए तैयार होना आवश्यक है। विपरीत if (cond) {affirm-conseq} else {neg-conseq} के बारे में सच है। 0 डीके लिए कोड को देखने पर तीसरे ifelse तर्क के मूल्यांकन के आधार पर हमेशा "डीडी" का आधार निर्धारित किया जाता है।"नहीं" -वेक्टर कोड का मूल्यांकन "हां" -वेक्टर के बाद किया जाता है ताकि यह चुनने के लिए कि ऋणात्मक परिणाम वाले वेक्टर में कौन से आइटम "ans" -output वेक्टर को सौंपे जाते हैं।

+0

जो मुझे मिला था। मुझे बस याद आया कि eval() हमेशा एक वस्तु को वापस करता है, यद्यपि एक अदृश्य वस्तु। –

संबंधित मुद्दे