आर

2010-11-02 3 views
6

दोस्तों में `विकल्प 'का बेइल्डरिंग व्यवहार, यह मुझे पागल बनाता है।आर

यह काम करता है के रूप में उम्मीद:

eobj <- substitute(obj <- list(a, b), list(a = 32, b = 33)) 
eval(eobj) 
obj 
[[1]] 
[1] 32 

[[2]] 
[1] 33 

अब, यह प्रयास करें:

efun <- substitute(fun <- function() a+ b, list(a = 32, b = 33)) 
str(efun) 
# language fun <- function() 32 + 33 
eval(efun) 
fun 
# function() a+ b 

यहाँ क्या चल रहा है? पृथ्वी पर कैसे eval अभिव्यक्ति के मूल रूप पर इसे हाथ मिला है?

उत्तर

8

कारण जब आप fun प्रिंट यह वास्तव में समारोह के प्रिंट स्रोत (attributes(fun) देखें) जो substitute द्वारा संशोधित नहीं कर रहा है।

ध्यान दें कि जब आप a या b को वैश्विक वर्कस्पेस फ़ंक्शन परिणाम में परिभाषित करते हैं तो वही होते हैं।

आप body(fun) द्वारा समारोह की वास्तविक कोड देख सकते हैं।

या तुलना:

print.function(fun, useSource=FALSE) 
# function() 
# 32 + 33 
print.function(fun, useSource=TRUE) # Which is default 
# function() a+ b 
+0

याप, यह स्रोत वास्तव में है। लेकिन, मैं अभी भी उलझन में हूं, क्या स्रोत आया है? मज़ा का स्रोत वस्तु से अलग रखा जाता है? अभिव्यक्ति 'efun' का स्रोत का कोई संदर्भ नहीं है। 'eval' की मूल परिभाषा तक सीधी पहुंच नहीं है। – VitoshKa

+0

मुझे लगता है कि स्रोत 'विकल्प' कार्यों से पहले सेट किया गया है। यह 'फ़ंक्शन' तर्क स्रोत के साथ प्रकार अभिव्यक्ति (भाषा?) का ऑब्जेक्ट बनाता है और उसके बाद 'ए' और' बी 'के मानों को प्रतिस्थापित करने के विकल्प को उचित मूल्य वाले बाएं स्रोत के साथ प्रतिस्थापित करता है। – Marek

+2

'attr (मजेदार," स्रोत ") 'स्रोत को दिखाता है कि यह आपके फ़ंक्शन के लिए चारों ओर रखता है और वास्तव में' प्रिंट 'वास्तव में प्रिंट करता है। यदि कोई स्रोत नहीं है, तो 'प्रिंट' वास्तविक कार्य दिखाएगा। इस प्रकार 'attr (मजेदार," स्रोत ") <- NULL'' स्रोत 'की सामग्री के बजाय वास्तविक कार्य दिखाने के लिए' प्रिंट 'का कारण बनता है। इसके अलावा 'विकल्प (keep.source = FALSE)' का उपयोग इस व्यवहार को पूरी तरह से बंद करने के लिए किया जा सकता है, इस मामले में आपके कार्यों को पहले स्थान पर 'स्रोत' 'विशेषता नहीं मिलेगी। –