3

我正在制作一个 CDF 文档,其中我将动态片段放在文本中间。该文档应该在播放器中工作。

注册应该从分散在不同单元格周围的所有动态部分访问的 glogal 值的最佳方法是什么?

例如,我想定义 g=9.8,并且我希望放置在不同单元格中的所有动态都可以访问此值。因为这应该对播放器起作用,所以这个值应该在 Mathematica 的会话中保持不变。

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

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

两者似乎都太做作了。

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

那么,如何在不使用 Manipulate 结构的情况下“保存定义”呢?

4

3 回答 3

2

一种可能性是为文档中的Initialization每个Dynamic对象定义条件,并将初始化表达式放在初始化单元格中(或在其他带有标签的单元格中,以便轻松识别它)。例如,使用初始化单元:

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

通过这种方式,您无需在每个Dynamic对象中存储初始化表达式,并且不会为每个对象重复评估这些表达式。


更新

看来NotebookDynamicExpression笔记本的选项是你想要的。约翰·富尔茨写道

" Dynamics 可以存储在前端选项CellDynamicExpressionNotebookDynamicExpressionFrontEndDynamicExpression中。这些Dynamics 不会显示,但会在显示它们所连接的单元格/笔记本/前端时更新。"

所以解决方案是:

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

在评估上述内容后,尝试保存并再次打开笔记本。并检查a.

于 2011-08-28T09:30:03.997 回答
0

我没有像你那样在动态文档中尝试过这个,但你可以试试这个:

“使用初始化单元,您可以指定应首先评估笔记本的特定输入单元。这可确保以正确的顺序评估您的代码,例如在评估使用这些定义的单元之前定义函数。”

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

于 2011-08-28T09:11:41.913 回答
0

您可以使用以下内容:

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

第一次评估string时不存在,因此 StringQ 导致 Dynamic 显示“”。此后 StringQ 的计算结果为 True,Dynamic 将文本显示在string. savetext通过作为 DynamicModule 局部变量跨会话保存。

string可以直接更新,例如string = "new text"

但是,如果此构造的多个副本同时打开,则一个string变量将更新另一个变量。

看到有关如何隔离实例的建议(不重命名“字符串”)会很有趣。

于 2011-08-28T10:28:28.067 回答