我正在制作一张CDF文件,我将动态文件放在文本中间。该文档应该在播放器中工作。
注册glogal值的最佳方法是什么?应该从散布在不同单元格周围的所有动态片段中访问这些值?
例如,我想定义g = 9.8,并且我想要通过放置在不同单元格中的所有动态来访问该值。由于这应该适用于播放器,因此该值应该在Mathematica会话中保持不变。
我只能想到两种不同的方式:
两者看起来都太人工了。
任何其他只在显示定义后才设置定义的方法并不好,因为接受显示动态的人可能已经向下滚动,并通过实现所有必需定义的动态传递。
那么,如何在不使用Manipulate结构的情况下“SaveDefintions”?
答案 0 :(得分:2)
一种可能性是为文档中的每个Initialization
对象定义条件Dynamic
,并将初始化表达式放在初始化单元格中(或者在其他具有标记的单元格中,以便轻松识别它)。例如,使用初始化单元格:
Manipulate[
Plot[n f[x], {x, -3, 3}], {n, 1, 4},
Initialization :> If[!TrueQ[$initialized],
FrontEndTokenExecute["EvaluateInitialization"]]]
通过这种方式,您不需要在每个Dynamic
对象中存储初始化表达式,并且不会对每个表达式重复计算这些表达式。
似乎Notebook的NotebookDynamicExpression
选项是您想要的。 John Fultz wrote关于它:
“Dynamic
可以存储在前端选项CellDynamicExpression
,NotebookDynamicExpression
和FrontEndDynamicExpression
中。这些Dynamic
不会显示,但是当显示它们所附着的单元格/笔记本/前端时更新。“
所以解决方案是:
SetOptions[EvaluationNotebook[], NotebookDynamicExpression :> (a = 1)]
在评估上述内容后尝试保存并再次打开笔记本。并检查a
的定义。
答案 1 :(得分:0)
我没有像你一样在动态文档中尝试过这个,但你可以试试这个:
“使用初始化单元格,您可以指定应首先评估笔记本的特定输入单元格。这可确保以正确的顺序评估代码,例如在评估使用这些定义的单元格之前定义函数。”
http://reference.wolfram.com/mathematica/howto/WorkWithInitializationCells.html
答案 2 :(得分:0)
您可以使用以下内容:
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')会很有趣。