Есть ли способ отделить открытые ноутбуки Mathematica, чтобы они не делили какие-либо переменные? Как сделать так, чтобы некоторые переменные были общими, но не все?
Mathematica - Разделительные ноутбуки
Ответ 1
Да, есть. Я рекомендую читать документацию, связанную с контекстами Mathematica. В двух словах все переменные принадлежат некоторому контексту (пространству имен), и все переменные могут быть доступны через их полностью квалифицированные имена формы "ContextName`varName". Если вы просто используете "varName", Mathematica будет искать контексты в $ContextPath
(попробуйте оценить переменную $ContextPath
, чтобы увидеть, что это такое), и будет использовать первый контекст, где он найдет эту переменную. Кроме того, каждый блокнот указывает контекст (хранится в переменной $Context
), где хранятся все его переменные (если не используется полностью квалифицированное имя).
По умолчанию для всех ноутбуков контекст "Глобальный". Также по умолчанию $ContextPath для всех ноутбуков включает контекст "Глобальный" (а также "Система" и некоторые другие). Конечным результатом является то, что переменные распределяются между ноутбуками, и это довольно быстро становится раздражающим. Однако есть простое решение. Чтобы создать контекст "private" для ноутбука, оцените следующее:
SetOptions[EvaluationNotebook[], CellContext -> Notebook]
Для этого ноутбука будет назначен уникальный контекст (оцените переменную $Context
, чтобы узнать, что это такое). Кроме того, глобальный контекст будет удален из ContextPath (попробуйте оценить $ContextPath
до и после SetOptions[...]
выше, чтобы узнать, что происходит.)
[ Обновление. Как указано rcollyer в новом обмене стека Mathematica, чтобы установить этот параметр как стандартное для новых ноутбуков, выполните следующие действия: откройте опцию Inspector (Ctrl + Shift + O), измените область действия (в раскрывающемся списке вверху) с "Выбор" на "Глобальные настройки"; слева разверните узлы Параметры ячейки → Параметры оценки и измените параметр CellContext на "Ноутбук".]
Теперь, как создать общий контекст:
Begin["SharedContext`"];
varShared1 = "Shared string";
End[];
В качестве альтернативы вы можете просто ввести
SharedContext`varShared1 = "Shared string";
Теперь вы можете использовать полные имена ( "SharedContext`varShared1" будет работать в любом ноутбуке), или вы можете добавить контекст в $ContextPath:
AppendTo[$ContextPath, "SharedContext`"]
Если вы сделаете это во всех ноутбуках, varShared1 станет видимым без полного имени.
Подводя итог, контекст работает так же, как и многие другие пути поиска. Однако есть много тонкостей (например, если символ уже определен в каком-то другом контексте, блок Begin ["SharedContext`]/End [] может работать не так, как вы ожидаете - существующий контекст символа будет вместо SharedContext`), поэтому я рекомендую здоровую дозу экспериментов и ознакомление с документами.
Ответ 2
Я не уверен, что это мудрая вещь, но все равно.
Вот схематическое решение для двух ноутбуков. Это может быть обобщено, но это не просто.
-
Откройте две ноутбуки
-
В каждом из них перейдите в меню (оценка → Стандарт по умолчанию для ноутбука контекст → Уникальный для этого ноутбука) При этом символы больше не разделяются.
-
В каждом ноутбуке введите что-то например
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]
Что это.
Вы можете использовать двунаправленное значение или только в одном направлении, вводя f [x] только в Ноутбуке, который вы хотите в качестве исходного значения для x. Другой ноутбук получит обновленное значение, но он не обновит его.
НТН!
Изменить
К автоматизации:
Вы можете получить все остальные открытые контексты ноутбуков, чтобы обновить общие символы:
ctxs[]:= Complement[Contexts["Notebook$$*"],
[email protected][{Context[]},
StringCases[Contexts["Notebook$$*"], __ ~~ "Private" ~~ __]]]
Итак, ваш f станет чем-то вроде этого (не проверен)
f[s_, val_] := [email protected][#,
[email protected]@s, "=", [email protected]]&/@ctxs[];
Ответ 3
Чтобы показать все уникальные контексты ноутбуков, откройте опцию Инспектор и установите
Параметры соты → Параметры оценки → Контекст ячейки до Notebook
.