Как «SaveDefintions» без использования структуры Manipulate? - PullRequest
3 голосов
/ 28 августа 2011

Я делаю документ CDF, где я помещаю динамические фрагменты в середине текста.Этот документ должен работать в проигрывателе.

Каков наилучший способ регистрации глобальных значений, к которым следует обращаться из всех динамических фрагментов, разбросанных по разным ячейкам?

Например,Я хочу определить g = 9,8, и я хочу, чтобы к этому значению обращались все динамики, размещенные в разных ячейках.Так как это должно работать на плеере, это значение должно сохраняться во время сеансов Mathematica.

Я мог думать только о 2 разных путях:

  • кнопка действия, которую нужно нажатьпользователь, когда он открывает файл, запускает все необходимые = и: = используемые вокруг записной книжки
  • создает пустую манипуляцию с SaveDefinitions-> True, и чья переменная не локализована для манипуляций

Оба кажутся слишком искусственными.

Использование любого другого метода, который устанавливает определения только после его отображения, не годится, так как человек, который принимает отображение динамики, возможно, уже прокрутил внизи передается динамикой, которая реализует все необходимые определения.

Итак, как выполнить «SaveDefintions» без использования структуры Manipulate?

Ответы [ 3 ]

2 голосов
/ 28 августа 2011

Одной из возможностей является определение условного Initialization для каждого Dynamic объекта в документе и помещение выражений инициализации в ячейку инициализации (или в другую ячейку с тегом, который позволяет легко идентифицировать его). Например, используя ячейку инициализации:

Manipulate[
 Plot[n f[x], {x, -3, 3}], {n, 1, 4}, 
 Initialization :> If[!TrueQ[$initialized],
                      FrontEndTokenExecute["EvaluateInitialization"]]]

Таким образом, вам не нужно хранить выражения инициализации в каждом Dynamic объекте, и эти выражения не будут повторно оцениваться для каждого из них.


Обновление

Похоже, что опция NotebookDynamicExpression в Notebook - это то, что вам нужно. Джон Фульц написал об этом:

"Dynamic s могут быть сохранены в параметрах интерфейса CellDynamicExpression, NotebookDynamicExpression и FrontEndDynamicExpression. Эти Dynamic s не отображаются, но обновляются, когда ячейка / ноутбук / внешний интерфейс, к которому они прикреплены отображается. "

Итак, решение:

SetOptions[EvaluationNotebook[], NotebookDynamicExpression :> (a = 1)]

Попробуйте сохранить и снова открыть записную книжку после оценки выше. И проверь определение для a.

0 голосов
/ 28 августа 2011

Вы можете использовать что-то вроде этого:

DynamicModule[{savetext = ""},
 Dynamic[If[StringQ[string], savetext = string, savetext],
  Initialization :> (string = savetext)]]

При первой оценке string не существует, поэтому StringQ приводит к динамическому отображению "". После этого StringQ оценивается как True, а Dynamic показывает текст в string. savetext сохраняется между сеансами, будучи локальной переменной DynamicModule.

string может быть обновлено напрямую, например, string = "new text"

Однако, если открыто несколько копий этой конструкции одновременно, одна переменная string обновит другую.

Было бы интересно увидеть предложения о том, как можно изолировать экземпляры (без переименования 'string').

0 голосов
/ 28 августа 2011

Я не пробовал это в динамическом документе, как вы, но вы можете попробовать это:

"Используя ячейки инициализации, вы можете указать, что в первую очередь должны оцениваться определенные входные ячейки записной книжки. Это гарантирует, что ваш код будет оцениваться в правильном порядке, например, определение функций перед оценкой ячеек, использующих эти определения."

http://reference.wolfram.com/mathematica/howto/WorkWithInitializationCells.html

...