Wolfram mathematica 如何";“保存定义”;不使用操纵结构? 我正在做一个CDF文档,我把动态片段放在文本的中间。这个文档应该在播放器中工作

Wolfram mathematica 如何";“保存定义”;不使用操纵结构? 我正在做一个CDF文档,我把动态片段放在文本的中间。这个文档应该在播放器中工作,wolfram-mathematica,wolfram-cdf,mathematica-cdf,Wolfram Mathematica,Wolfram Cdf,Mathematica Cdf,注册应该从分散在不同单元格中的所有动态块访问的glogal值的最佳方法是什么 例如,我想要定义g=9.8,并且我想要放置在不同单元中的所有动力学都可以访问该值。因为这应该对播放器起作用,所以这个值应该在Mathematica的各个会话中保持不变 我只能想到两种不同的方法: 用户打开文件时必须单击的操作按钮,用于启动笔记本上使用的所有必需的=和:=命令 使用SaveDefinitions->True创建一个空操纵,其变量未本地化为操纵 两者似乎都太做作了 让任何其他方法只在显示时设置定义都是不

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

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

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

  • 用户打开文件时必须单击的操作按钮,用于启动笔记本上使用的所有必需的=和:=命令
  • 使用SaveDefinitions->True创建一个空操纵,其变量未本地化为操纵
两者似乎都太做作了

让任何其他方法只在显示时设置定义都是不好的,因为接受显示动态的人可能已经向下滚动,并经过实现所有所需定义的动态


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

我在dynamics文档中没有像您这样尝试过,但您可以尝试以下方法:

使用初始化单元格,可以指定首先计算笔记本的特定输入单元格。这样可以确保代码按正确的顺序计算,例如在计算使用这些定义的单元格之前定义函数


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

Manipulate[
 Plot[n f[x], {x, -3, 3}], {n, 1, 4}, 
 Initialization :> If[!TrueQ[$initialized],
                      FrontEndTokenExecute["EvaluateInitialization"]]]
这样,您就不需要在每个
动态
对象中存储初始化表达式,并且不会对每个对象重复计算这些表达式


更新 似乎笔记本电脑的
NotebookDynamicExpression
选项就是您想要的。约翰·富尔茨:

Dynamic
s可以存储在前端选项
CellDynamicExpression
NotebookDynamicExpression
frontendynamicexpression
中。这些
Dynamic
s不会显示,而是在显示它们所连接的单元格/笔记本/前端时更新

因此,解决方案是:

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

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

的定义。您可以使用以下内容:

DynamicModule[{savetext = ""},
 Dynamic[If[StringQ[string], savetext = string, savetext],
  Initialization :> (string = savetext)]]
在第一次求值时,
string
不存在,因此StringQ导致动态显示“”。此后,StringQ的计算结果为True,Dynamic在
string
中显示文本
savetext
作为DynamicModule局部变量跨会话保存

string
可以直接更新,例如
string=“新文本”

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


如果能看到关于如何隔离实例(不重命名“字符串”)的建议,那将很有意思。

为什么不使用
初始化
选项?当动态对象第一次显示时,它将只计算初始化一次。@Alexey-我将在哪个动态中使用它?第一个呢?如果用户在接受动态显示之前已经向下滚动并传递了它?如果我全部定义,它就失去了意义,因为有些定义只是沿着文档重复的输入字段的初始值(我让用户在不同的地方定义一个新值…)。对于info,定义是:用户最近可以更改的变量的起始值,永远不会更改的变量,函数,纯和:=我认为另一个选项,但也不是很好,就是在用户打开文件时只显示一个按钮。文件的其余部分都在一个隐藏的章节中。单击按钮后,它将定义变量、自行消失并取消隐藏作为主要文档主体的章节。但似乎也artificial@Alexey-这是可能的。该警告不会改变文档查看过程中的任何内容,但动态显示为深灰色除外。它应该可以正常工作。尽管它会在我的非常小的/优雅的动态代码中间添加一些“垃圾”代码,但我可能会朝这个方向前进。你知道如何使用NooBooDigabyEx表达式吗?这个函数的帮助太小了,我不知道如何使用它,如果它做了我想要的事情…@P.Fonseca笔记本的
NotebookDynamicExpression
选项似乎就是你想要的。John Fultz对此表示:“
Dynamic
s可以存储在前端选项
CellDynamicExpression
notebook dynamicexpression
,以及
frontendynamicexpression
。这些
Dynamic
s不会显示,而是在显示它们所连接的单元格/笔记本/前端时更新。”我会尝试一下,然后尽快回复您。不要使用setdelayed(崩溃Mathematica),这似乎很正常(不是崩溃的一部分),因为setdelayed通常会在动力学中导致无限循环。有什么想法吗?