相关疑难解决方法(0)

SaveDefinitions被认为是危险的

SaveDefinitions是一个不错的选择Manipulate.它导致Manipulate在Manipulate面板中存储用于创建的任何定义.以这种方式制作的Manipulate可以复制到空白笔记本中,并且仍然可以单独使用.此外,包含许多此类操作的工作笔记本也不会变成粉红色的盒子,打开时会在其下方打印错误消息.大!

然而,所有这些善良都有它的黑暗面,如果你不知道它,它会让你真的很难受.我已经在我已经工作了几天的笔记本中使用了这个,但是我向您展示了一个重新创建问题的分步玩具示例场景.

在这种情况下,你想创建一个Manipulate漂亮的波浪函数的图,所以你定义这个(请创建一个像这样的窗口大小,这很重要):

在此输入图像描述

定义很好,所以我们下次保留它并使其成为初始化单元.接下来我们添加Manipulate,并执行它.

f[x_] := x^2

Manipulate[
 Plot[n f[x], {x, -3, 3}],
 {n, 1, 4},
 SaveDefinitions -> True
 ]
Run Code Online (Sandbox Code Playgroud)

一切都很棒,Manipulate真的很闪耀,这是美好的一天.

在此输入图像描述

只是做你的偏执自我,检查定义是否正常:

在此输入图像描述

是的,一切仍然检查出来.精细.但现在你想到一个更好的波浪函数是正弦,所以你改变定义,执行和偏执,检查:

在此输入图像描述

一切都还好.你已经准备好从一天的努力中挽救你的工作并退出.[退出内核]

明天.你重新开始工作了.您评估笔记本中的初始化单元格.定义还好吗?校验.

在此输入图像描述

现在,您向下滚动到Manipulate框(不需要重新执行SaveDefinitions),使用滑块稍微玩一下.并向上滚动.

在此输入图像描述

作为你的偏执狂,你再次检查f的定义:

在此输入图像描述

瞧,有人改变了你背后的定义!Information根据In []数字(In[1]:def为f,In[2]第一个?,In[3]第二个?),在第一个和第二个(?)检查之间没有执行任何操作.

发生了什么?嗯,这Manipulate当然是.A FullForm揭示其内部结构:

Manipulate[Plot[n*f[x],{x, -3, 3}],{{n, 2.44}, 1, 4},Initialization:>{f[x_] := x^2}]
Run Code Online (Sandbox Code Playgroud)

你有罪魁祸首.框的初始化部分再次定义f,但它是旧版本,因为我们Manipulate在修改其定义后没有重新评估.一旦操纵盒出现在屏幕上,它就会被评估,并且您已经恢复了原来的定义.在全球范围内!

当然,在这个玩具示例中,很明显发生了一些奇怪的事情.在我的情况下,我在一个更大的笔记本中有一个更大的模块,在经过一些调试后,我改变了一小部分.它似乎工作,但第二天,同样的错误,在再次击中之前曾经惹过我.我花了几个小时才意识到我用来研究各方面问题的几个操作中的一个是这样做的.

显然,我很想说,这是不受欢迎的行为.现在,对于强制性问题:除了在每次更改可能由他们使用的定义时重新执行笔记本中的每个操作之外,我们还能做些什么来防止这种背后行为Manipulate发生Manipulate

wolfram-mathematica mathematica-frontend

20
推荐指数
2
解决办法
1003
查看次数