आर

2011-12-22 28 views
10

में अभिव्यक्ति वृक्ष बनाना R में विकल्प फ़ंक्शन एक पेड़ के रूप में एक भाषा वस्तु बनाता है जिसे कोई पार्स कर सकता है। मैं सूची का उपयोग करके स्क्रैच से पेड़ कैसे बना सकता हूं या फिर इसे eval करने के लिए?आर

# substitute gives a tree representation of the expression 
a=1; b=2; 
e1 = substitute(a+2*b) 
eval(e1)  #gives 5 as expected 
e1   # is type language 
e1[[1]]  # this is `+` 
e1[[2]]  # this is 'a' type symbol 
e1[[3]]  # this is type language 
e1[[3]][[1]] # this is `*` etc.... 

मुझे पता है कि मैं कैसे e1 वस्तु प्रोग्राम के रूप में फिर से संगठित कर सकते हैं करना चाहते हैं। आदर्श रूप से मैं जटिल सूचियों के साथ उनमें सही वस्तु के साथ एक वस्तु बना सकता हूं और शायद मैं ऑब्जेक्ट पर कुछ as.language पर कॉल कर सकता हूं। हालांकि यह काम नहीं करता है। उदाहरण के लिए:

# how to construct the tree? 
eval(list(as.symbol('+'),1,1))    # does not return 2 
eval(as.expression(list(as.symbol('+'),1,1))) # does not return 2 

एक तरह से सिर्फ स्ट्रिंग '1 + 1' और फिर इसे पार्स उत्पन्न करने के लिए है, लेकिन यह आप पहली जगह में पेड़ है जब फिर से उन्हें पार्स करने के लिए तार उत्पन्न करने के लिए सुरुचिपूर्ण प्रतीत नहीं होता !

eval(parse(text='1+1')) # does return 1, but not elegant if tree is 
         # large and already in memory 

आपकी मदद के लिए धन्यवाद!

उत्तर

6
> plus <- .Primitive("+") 
> plus 
function (e1, e2) .Primitive("+") 
> times=.Primitive("*") 
> eval(call("plus", b, call("times",2, b))) 
[1] 6 
> eval(call("plus", a, call("times",2, b))) 
[1] 5 
+1

भी बेहतर काम करता है, इसलिए मैं केवल 'कॉल (' + 'कर सकता हूं , ई 1, ई 2) 'एक प्लस के साथ 2 अभिव्यक्ति को गठबंधन करने के लिए, सही! – tlamadon

7

प्रोग्रामिंग रूप से आर अभिव्यक्तियों का निर्माण करने के कुछ तरीके हैं। सबसे सुविधाजनक है, अगर यह आपके मामले के लिए काम करता है, bquote है:

> a = 1 
> bquote(.(a) + .(a)) 
1 + 1 

जहां .() एक उलटा-उद्धरण है। यह व्यावहारिक रूप से कुछ भी करने के लिए काम करना चाहिए, लेकिन अगर ऐसा नहीं होता है, वहाँ तरीके मैन्युअल अभिव्यक्ति की बुनियादी निर्माण घटक के निर्माण के लिए कर रहे हैं:

> as.symbol('f') 
f 
> as.call(list(quote(f), 1, 2)) 
f(1, 2) 
> as.call(list(as.symbol('{'), 1, 2)) 
{ 
    1 
    2 
} 
> 
+0

महान, 'as.call' मैं के लिए वास्तव में तलाश थी। 2 अभिव्यक्तियों से उन्हें एक तिहाई में कैसे जोड़ना है और 'as.call (सूची (as.symbol (' + '), e1, e2))' – tlamadon