Подтвердить что ты не робот

Mathematica - Разделительные ноутбуки

Есть ли способ отделить открытые ноутбуки Mathematica, чтобы они не делили какие-либо переменные? Как сделать так, чтобы некоторые переменные были общими, но не все?

4b9b3361

Ответ 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.