2011-02-04 11 views
24

क्या खुले गणित नोटबुक को अलग करने का कोई तरीका है ताकि वे किसी भी चर को साझा न करें? इसे बनाने के बारे में कैसे कुछ चर साझा किए जाते हैं लेकिन सभी नहीं?गणित - अलग-अलग नोटबुक

उत्तर

35

हां, वहाँ है। मैं गणित संदर्भ से संबंधित दस्तावेज पढ़ने की सलाह देते हैं। संक्षेप में, सभी चर कुछ संदर्भ (नेमस्पेस) से संबंधित हैं, और सभी चरों को "ContextName`varName" फ़ॉर्म के अपने पूर्ण-योग्य नामों के माध्यम से एक्सेस किया जा सकता है। यदि आप केवल "varName" का उपयोग करते हैं, तो गणित $ContextPath में संदर्भों की खोज करेगा (यह देखने के लिए चर $ContextPath का मूल्यांकन करने का प्रयास करें), और उस संदर्भ को पहले संदर्भ का उपयोग करेगा जहां यह उस चर को पाता है। इसके अलावा, प्रत्येक नोटबुक एक संदर्भ निर्दिष्ट करता है (परिवर्तनीय $Context में संग्रहीत) जहां इसके सभी चर संग्रहीत किए जाते हैं (जब तक पूरी तरह से योग्य नाम का उपयोग नहीं किया जाता है)।

डिफ़ॉल्ट रूप से, सभी नोटबुक के लिए संदर्भ "वैश्विक" है। डिफ़ॉल्ट रूप से, सभी नोटबुक के लिए $ ContextPath में "ग्लोबल" संदर्भ (साथ ही "सिस्टम`" और कुछ अन्य शामिल हैं) शामिल हैं। शुद्ध परिणाम यह है कि वेरिएबल नोटबुक में साझा किए जाते हैं, और यह जल्दी से परेशान हो सकता है। हालांकि, एक आसान समाधान है। एक नोटबुक के लिए एक "निजी" संदर्भ बनाने के लिए, का मूल्यांकन निम्नलिखित:

SetOptions[EvaluationNotebook[], CellContext -> Notebook] 

इस नोटबुक एक अद्वितीय संदर्भ (चर $Context का मूल्यांकन देखने के लिए कि यह क्या है) आवंटित किया जाएगा। इसके अलावा, वैश्विक संदर्भ ContextPath (। यह देखने के लिए क्या हो रहा है से पहले और इसके बाद के संस्करण SetOptions[...] के बाद $ContextPath का मूल्यांकन करने की कोशिश)

[अद्यतन से निकाल दिया जाएगा: जैसा कि नई मेथेमेटिका ढेर एक्सचेंज पर rcollyer द्वारा कहे अनुसार, इस सेट करने के लिए विकल्प नई नोटबुक के लिए डिफ़ॉल्ट के रूप में, निम्न कार्य करें: विकल्प निरीक्षक (Ctrl + Shift + O) खोलें, "चयन" से "वैश्विक प्राथमिकताएं" से दायरे को बदलें (शीर्ष पर ड्रॉपडाउन में); बाईं तरफ नोड्स सेल विकल्प का विस्तार -

> मूल्यांकन विकल्प, और CellContext सेटिंग बदलने] अब, यहाँ एक साझा संदर्भ बनाने का तरीका बताया "नोटबुक।": वैकल्पिक रूप से

Begin["SharedContext`"]; 
varShared1 = "Shared string"; 
End[]; 

, आप कर सकते थे ' बस

SharedContext`varShared1 = "Shared string"; 

टाइप किया गया है अब आप पूरी तरह से योग्य नामों का उपयोग कर सकते हैं या तो ("SharedContext`varShared1" किसी भी नोटबुक में काम करेंगे), या आप $ ContextPath के संदर्भ जोड़ सकते हैं:

AppendTo[$ContextPath, "SharedContext`"] 

यदि आप इसे सभी नोटबुक में करते हैं, तो varShared1 पूरी तरह से योग्य नाम के बिना दिखाई देगा।

संक्षेप में, संदर्भ कई अन्य खोज पथों की तरह काम करता है। हालांकि, कई subtleties हैं (उदाहरण के लिए, यदि किसी अन्य संदर्भ में एक प्रतीक पहले ही परिभाषित किया गया है, तो शुरूआत ["SharedContext`"]/end [] ब्लॉक आपके काम की अपेक्षा नहीं कर सकता है - प्रतीक का मौजूदा संदर्भ होगा SharedContext` के बजाय उपयोग किया जाना चाहिए), इसलिए मैं प्रयोग की एक स्वस्थ खुराक की सिफारिश करता हूं और दस्तावेज़ों को समझता हूं।

+0

हाँ। मेरी तुलना में काफी बेहतर है। हटाया जा रहा है। –

+6

आप इसे मूल्यांकन> नोटबुक के डिफ़ॉल्ट संदर्भ मेनू (सेटऑप्शन के बजाए) के माध्यम से भी सेट कर सकते हैं। [प्रलेखन "प्रत्येक सेल समूह के लिए अद्वितीय" सेटिंग का उपयोग करता है ताकि कोई परिवर्तनीय विवाद न हो।] –

+1

अनुवर्ती प्रश्न: क्या वहां है वैसे भी गणित को नई नोटबुक के संदर्भ को डिफ़ॉल्ट रूप से निजी रूप से सेट करने के लिए, हर नई नोटबुक के लिए मैन्युअल रूप से निजी संदर्भ बनाने के बजाय? – Joe

1

मुझे सच में यकीन नहीं है कि यह करने के लिए एक बुद्धिमान बात है, लेकिन वैसे भी।

यहां दो नोटबुक के लिए एक योजनाबद्ध समाधान है। इसे सामान्यीकृत किया जा सकता है, लेकिन यह सीधा नहीं है।

  1. ओपन दो नोटबुक

  2. उनमें से प्रत्येक में मेनू के पास जाओ (मूल्यांकन -> नोटबुक के डिफ़ॉल्ट संदर्भ -> इस नोटबुक के लिए अद्वितीय) इस के साथ, प्रतीकों अब और साझा नहीं कर रहे हैं।

  3. प्रत्येक नोटबुक में प्रत्येक नोटबुक में अब नोटबुक प्रसंग

  4. पाने के लिए निम्नलिखित कोड

दर्ज Context[] की तरह कुछ दर्ज करें।

Needs["Experimental`"]; 
    SetAttributes[f, HoldFirst]; 

    f[s_, val_] := [email protected]["Notebook$$17$799580`", 
        [email protected]@s, "=", [email protected]]; 

    ValueFunction[t] = f 

कहाँ Notebook$$17$799580 (अन्य नोटबुक के संदर्भ इस में सक्षम होना चाहिए कि "स्वचालित रूप से" प्राप्त करने के लिए किया जाएगा, लेकिन इस अवधारणा को केवल का प्रमाण है।

अब जब आप एक प्रतीक साझा करना चाहते हैं

f[symbolToShare] 

दर्ज यह है कि।

आप मूल्य दोनों ओर साझा कर सकते हैं, या बस में एक ही दिशा, च [x] नोटबुक y केवल में प्रवेश करने कहां एक्स के लिए स्रोत मान के रूप में चाहते हैं। अन्य नोटबुक को अपडेट किया गया मान मिलेगा, लेकिन यह इसे वापस अपडेट नहीं करेगा।

एचटीएच!

संपादित

स्वचालन की ओर:

आप अपने साझा प्रतीकों अद्यतन करने के लिए अन्य सभी खुले नोटबुक संदर्भ प्राप्त कर सकते हैं के रूप में:

ctxs[]:= Complement[Contexts["Notebook$$*"], 
        [email protected][{Context[]}, 
        StringCases[Contexts["Notebook$$*"], __ ~~ "Private" ~~ __]]] 

तो अपने च कुछ इस तरह (बन नहीं होगा परीक्षण किया गया)

f[s_, val_] := [email protected][#, 
        [email protected]@s, "=", [email protected]]&/@ctxs[]; 
0

सभी नोटबुक अद्वितीय संदर्भों खुला विकल्प इंस्पेक्टर देने के लिए और सेल विकल्पमूल्यांकन विकल्पसेल संदर्भNotebook को सेट करने के लिए।