2015-11-20 7 views
6

ऑब्जेक्ट उन्मुख आर प्रोग्रामिंग (विशेष रूप से विंस्टन चांग के आर 6 पैकेज) में, active binding क्या है?ऑब्जेक्ट उन्मुख आर प्रोग्रामिंग में, "सक्रिय बाध्यकारी" क्या है?

+1

'help.search (" सक्रिय बाध्यकारी ")'> '? Bindenv'> * उदाहरण * –

+1

@ जोशुआउलिच: हालांकि यह शायद एक सही तकनीकी वर्णन है, यह किसी ऐसे व्यक्ति के लिए बहुत प्रबुद्ध नहीं है जो पहले से ही समझ में नहीं आता है एक बाध्यकारी है ... – histelheim

उत्तर

10

सबसे पहले यह समझना सबसे अच्छा है कि "बाध्यकारी" क्या है। हम जैसे कोड चलाते हैं:

x <- 5 
तो

क्या कंप्यूटर के अंदर हुआ है कि हम स्मृति का एक स्लॉट में 5 के मान डाल दिया है और हम भी उस स्थान पर 'बाध्य' है नाम "x" और है मूल्य ताकि बाद में हम x का उपयोग कर सकें और यह उस स्मृति स्थान पर जायेगा और मूल्य को देखेगा (जो तब तक 5 है जब तक हम इसे किसी अन्य चीज़ में नहीं बदलते)। इसे स्थैतिक बाध्यकारी कहा जाता है क्योंकि जब तक कार्यक्रम विशेष रूप से परिवर्तन नहीं करता है तब तक मूल्य परिवर्तित नहीं होता है।

एक सक्रिय बाध्यकारी समान है कि हम एक परिवर्तनीय नाम (जैसे "x") को किसी चीज़ पर बांधते हैं, लेकिन कुछ ऐसा केवल स्थिर मूल्य नहीं है, बल्कि एक कार्य जो हर बार चलाया जाएगा जब हम x तक पहुंचने का प्रयास करेंगे । तो आप 0xपर कॉल करते समय "x" नाम को बाध्य कर सकते हैं और फिर जब भी आप x तक पहुंचते हैं तो आपको एक अलग यादृच्छिक सामान्य मान दिखाई देगा।

एक अन्य उदाहरण है, पर विचार अगर हम की तरह स्थिर बाइंडिंग के साथ कुछ करना:

mydf <- data.frame(x=1:10, y=10:1) 
df.size <- nrow(mydf) 
mydf <- data.frame(z=1:100) 

अब चर df.sizemydf की पंक्तियों की संख्या कब बनाया गया था है, नहीं है कि यह कैसे कई पंक्तियों अब है (nrow के बाद से एक बार चलाया गया था, तो परिणाम को df.size वैरिएबल में स्थिर बाध्यकारी के रूप में रखा गया था, यह डेटा फ्रेम में परिवर्तनों के साथ अद्यतन नहीं होता है)। यदि दूसरी तरफ हमने df.size और nrow(mydf) चलाए गए फ़ंक्शन के बीच एक सक्रिय बाध्यकारी बनाया तो किसी भी समय हमने df.size के "मान" को देखा, तो यह mydf में पंक्तियों की वर्तमान संख्या दिखाएगा चाहे कितनी बार हम इसे बदल दें।

+3

ग्रेग के उदाहरण बताते हैं कि प्रतीक 'डेटा' चर या किसी फ़ंक्शन पर कैसे बाध्य होता है, लेकिन दोनों मामलों में बाध्यकारी स्थिर है; एक समारोह एक पूर्णांक वेक्टर (आईएनटीएसएक्सपी) के रूप में एक आर वस्तु (तकनीकी रूप से, एस-अभिव्यक्ति, उदाहरण के लिए, एक CLOSXP) है। आर की सक्रिय बाइंडिंग वे प्रतीक हैं जो चर की तरह दिखती हैं लेकिन 'गेट' और 'सेट' कार्यक्षमता वाले कार्यों की तरह कार्य करती हैं - गैबर के उत्तर में 'यादृच्छिक नहीं' प्रतीक। यह हमेशा मुझे अजीब लगता है कि एक ऑब्जेक्ट सिस्टम (संदर्भ कक्षाएं या आर 6) इस quirky 'प्रयोगात्मक' सुविधा पर आधारित होगा (देखें '? MakeActiveBindng')। –

9

1) आर आर में, एक active binding का विचार है कि आप कुछ है जो एक चर की तरह लग रहा परिभाषित कर सकते हैं लेकिन यह वास्तव में एक समारोह में प्रत्येक बार पहुँचा जा सकता है invokes।

उदाहरण के लिए, यह समारोह makeActiveBinding (जो इस मामले में एक सामान्य यादृच्छिक variate उत्पन्न करता है) के बाद दूसरे स्थान तर्क में निर्दिष्ट कॉल करता है और समारोह के मान देता है के बाद से हर बार randomNo नीचे makeActiveBinding बयान एक चर के रूप में प्रयोग किया जाता है:

makeActiveBinding("randomNo", function() rnorm(1), .GlobalEnv) 

set.seed(123) # for reproducibility 
randomNo 
## [1] -0.5604756 
randomNo 
## [1] -0.2301775 

2) R6 इसी तरह, R6 में एक क्षेत्र की तरह एक सक्रिय बाध्यकारी दिखता है लेकिन यह वास्तव में एक समारोह जब फंक्शन का मान लौटने पहुँचा चलाता है।

यहां उदाहरण है (1) आर 6 सक्रिय बाइंडिंग के साथ फिर से करें। ध्यान दें कि प्रत्येक बार फ़ील्ड randomNo को संबंधित फ़ंक्शन (जो सामान्य यादृच्छिक विविधता उत्पन्न करता है) तक पहुंचाया जाता है और इसका मान फ़ील्ड के मान के रूप में लौटाया जाता है।

library(R6) 
RandomClass <- R6Class("Numbers", 
    active = list(
    randomNo = function() rnorm(1) 
) 
) 

set.seed(123) 
randomObject <- RandomClass$new() 
randomObject$randomNo 
## [1] -0.5604756 
randomObject$randomNo 
## [1] -0.2301775 

3) R6 - दूसरे उदाहरण एक और उदाहरण R6 सक्रिय बाध्यकारी प्रलेखन here में पाया जा सकता।कि उदाहरण में, हर बार क्षेत्र x2 एक्सेस किया जाता है जैसे कि यह एक साधारण क्षेत्र थे, वहाँ एक फोन (यह करने के लिए किसी भी तर्क से गुजर बिना) x2 के साथ जुड़े समारोह और x2 के मूल्य के किया जाता है कि समारोह चल रहा है का परिणाम है ।

+1

'get' और 'set' क्षमताओं दोनों को दिखाने के लिए सक्रिय बाध्यकारी उदाहरण का विस्तार करना बेहतर हो सकता है, 'fact' उदाहरण'? MakeActiveBinding' पर। –

+0

मुझे नहीं लगता कि यह उचित होगा। आर 6 में सक्रिय बाध्यकारी क्या है इसका जवाब है, इस पर एक पूर्ण ट्यूटोरियल नहीं है। मैंने पहले से ही विग्नेट के लिए एक लिंक प्रदान किया है जहां अधिक जानकारी मिल सकती है। –

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