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
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.
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.
Otwartych dwa notebooki
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.
W każdym notebookiem wprowadzić coś jak
Context[]
uzyskać Notebook ContextTeraz 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[];
Aby dać Wszystkie notebooki unikalne konteksty otwarty Opcje Inspector i ustawić komórkowych Opcje → opcje ewaluacyjne → Kontekst komórkowy do Notebook
.
- 1. Interaktywne notebooki Ipython na Heroku
- 2. Automagicznie generowania notebooki z odcinków zwiniętych
- 3. Jak przekonwertować notebooki Jupyter/IPython na LaTex?
- 4. Oddzielne pliki w Git
- 5. Sql Azure - oddzielne serwery?
- 6. Mathematica zabrakło pamięci
- 7. Integracja w Mathematica
- 8. Mathematica Downvalue Lhs
- 9. Algorytm antyaliasingu Mathematica
- 10. Odwrócenie spłaszczenia w Mathematica?
- 11. Implementacja Quadtree w Mathematica
- 12. Mapa Mathematica North America
- 13. Mathematica do Python
- 14. notebooki Konfigurowanie Jupyter dla inline Retina matplotlib figures
- 15. Oddzielne połączenie dbx do wątku
- 16. Git połączyć i zachować oddzielne?
- 17. EAR vs oddzielne EJB + WAR
- 18. CakePHP 2 oddzielne tablice logowania
- 19. Oddzielne podręczne playbacki udostępniania ansambla
- 20. Oddzielne kategorie dla typów wiadomości
- 21. Highcharts oddzielne datalabels na serii
- 22. Rozdzielanie rur a oddzielne rzędy
- 23. Oddzielne harmonogramy funkcji Azure webjob?
- 24. Uproszczenie wyrażeń regularnych w Mathematica
- 25. Interparyzacja interpolacji dużego stołu Mathematica
- 26. Mathematica „Listy” połączone i wydajność
- 27. Wykreślanie funkcji kroku w Mathematica
- 28. Uruchom program Mathematica w klastrze
- 29. Numeryczne różnicowanie listy w Mathematica
- 30. Uzyskiwanie obrazu Mathematica w Javie
Tak. Znacznie lepiej niż moje. Usuwanie. –
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.] –
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