如何在不使用Manipulate结构的情况下“SaveDefintions”?

时间:2011-08-28 08:11:35

标签: wolfram-mathematica wolfram-cdf mathematica-cdf

我正在制作一张CDF文件,我将动态文件放在文本中间。该文档应该在播放器中工作。

注册glogal值的最佳方法是什么?应该从散布在不同单元格周围的所有动态片段中访问这些值?

例如,我想定义g = 9.8,并且我想要通过放置在不同单元格中的所有动态来访问该值。由于这应该适用于播放器,因此该值应该在Mathematica会话中保持不变。

我只能想到两种不同的方式:

  • 操作按钮,当用户打开文件时,必须单击该按钮,启动笔记本周围所需的所有=和:=
  • 使用SaveDefinitions-> True创建一个空操作,其变量未本地化为Manipulate

两者看起来都太人工了。

任何其他只在显示定义后才设置定义的方法并不好,因为接受显示动态的人可能已经向下滚动,并通过实现所有必需定义的动态传递。

那么,如何在不使用Manipulate结构的情况下“SaveDefintions”?

3 个答案:

答案 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可以存储在前端选项CellDynamicExpressionNotebookDynamicExpressionFrontEndDynamicExpression中。这些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')会很有趣。