2011-02-04 11 views
24

Czy istnieje sposób na oddzielenie otwartych notebooków Mathematica, aby nie udostępniały żadnych zmiennych? Co powiesz na to, aby niektóre zmienne zostały udostępnione, ale nie wszystkie?Mathematica - oddzielne notebooki

Odpowiedz

35

Tak, jest. Polecam lekturę dokumentacji związanej z kontekstami Mathematica. W skrócie, wszystkie zmienne należą do pewnego kontekstu (przestrzeni nazw), a do wszystkich zmiennych można uzyskać dostęp za pomocą w pełni kwalifikowanych nazw postaci "Nazwa_wejścia" nazwa_węska ". Jeśli po prostu użyjesz "varName", Mathematica będzie szukać kontekstów w $ContextPath (spróbuj ocenić zmienną $ContextPath, aby zobaczyć, co to jest) i użyje pierwszego kontekstu, w którym znajdzie tę zmienną. Ponadto każdy notebook określa kontekst (przechowywany w zmiennej $Context), w którym przechowywane są wszystkie jego zmienne (o ile nie jest używana pełna nazwa).

Domyślnie dla wszystkich notebooków kontekst to "Global". Domyślnie, $ ContextPath dla wszystkich notebooków zawiera kontekst "Global" (jak również "System" i kilka innych). Rezultatem jest to, że zmienne są udostępniane w notebookach, a to może szybko stać się denerwujące. Istnieje jednak proste rozwiązanie. Aby stworzyć „prywatny” kontekst dla notebooka, ocenić następujące:

SetOptions[EvaluationNotebook[], CellContext -> Notebook] 

Ten notebook zostanie przypisany unikalny kontekst (ocenia zmiennej $Context aby zobaczyć co to jest). Ponadto, globalny kontekst zostanie usunięty z ContextPath (próby oceny $ContextPath przed i po wyżej SetOptions[...], aby zobaczyć co się dzieje.)

[Aktualizacja: Jak podkreślił rcollyer na nowym Mathematica stosu wymiany, aby ustawić ten opcja jako domyślna dla nowych notatników, wykonaj następujące czynności: otwórz Inspektora opcji (Ctrl + Shift + O), zmień zakres (w menu u góry) z "Wybór" na "Preferencje globalne"; po lewej stronie rozwinąć opcje węzły Cell -> Opcje oceny oraz zmienić CellContext ustawienie, aby]

A oto jak stworzyć wspólny kontekst „notebook”.:

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

Alternatywnie, można” Wcześniej po prostu wpisane

SharedContext`varShared1 = "Shared string"; 

teraz możesz albo (będzie działać w każdym notebooku „SharedContext`varShared1”) korzystać w pełni kwalifikowane nazwy, lub można dodać kontekst do $ ContextPath:

AppendTo[$ContextPath, "SharedContext`"] 

Jeśli zrobisz to we wszystkich notatnikach, varShared1 stanie się widoczny bez w pełni kwalifikowanej nazwy.

Podsumowując, kontekst działa podobnie jak wiele innych ścieżek wyszukiwania. Istnieje jednak wiele subtelności (na przykład, jeśli symbol został już zdefiniowany w innym kontekście, blok Begin ["SharedContext"]]/End [] może nie działać zgodnie z oczekiwaniami - istniejący kontekst symbolu będzie być użyte zamiast SharedContext "), więc zalecam zdrową dawkę eksperymentowania i przeglądania dokumentów.

+0

Tak. Znacznie lepiej niż moje. Usuwanie. –

+6

Można to również ustawić w menu Domyślny kontekst notatnika> Notatnik (zamiast w Ustawieniach). [W dokumentacji zastosowano ustawienie "Unikalne dla każdej grupy komórek", aby uniknąć konfliktów zmiennych.] –

+1

Pytanie uzupełniające: czy istnieje tak czy inaczej, aby program Mathematica domyślnie ustawiał kontekst nowych notatników jako prywatny, zamiast tworzyć osobny kontekst dla każdego nowego notatnika ręcznie? – Joe

1

Nie jestem do końca pewien, czy to mądra rzecz, ale w każdym razie.

Oto schematyczne rozwiązanie dla dwóch notebooków. Może być uogólniony, ale nie jest prosty.

  1. Otwartych dwa notebooki

  2. w każdym z nich trafiają do menu (ocena -> default kontekst notebooków -> Unikalne do tego notebooka) z tym, symbole nie są dzielone więcej.

  3. W każdym notebookiem wprowadzić coś jak Context[] uzyskać Notebook Context

  4. Teraz w każdym notebookiem wprowadzić następujący kod

.

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

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

    ValueFunction[t] = f 

Jeżeli Notebook$$17$799580 jest kontekście innego komputera (ten powinien być w stanie uzyskać „automatycznie”, ale jest to dowód tylko pojęcie.

Teraz, gdy chcesz podzielić się symbol wprowadzić

f[symbolToShare] 

tyle.

można podzielić wartość dwukierunkowo lub tylko w jednym kierunku, wprowadzając f [x] tylko w notatniku y chcesz jako wartość źródłowa dla x. Drugi notatnik otrzyma zaktualizowaną wartość, ale nie zaktualizuje go.

HTH!

Edit

kierunku automatyzacji:

Można uzyskać wszystkie innych kontekstach Otwórz notatnik, aby aktualizować swoje wspólnych symboli jak:

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

Więc f staną się coś takiego (nie przetestowany)

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

Aby dać Wszystkie notebooki unikalne konteksty otwarty Opcje Inspector i ustawić komórkowych Opcjeopcje ewaluacyjneKontekst komórkowy do Notebook.