Dynamic 动态交互问题

Dynamic 动态交互问题,dynamic,wolfram-mathematica,frontend,interactive,Dynamic,Wolfram Mathematica,Frontend,Interactive,我试图有两个面板,左侧显示一个图形和两个定位器,右侧显示定位器定义的区域中的放大版本 我试过了 ClearAll[mndpt]; mndpt = Compile[{{c, _Complex}, {maxiter, _Integer}}, Module[{z, iters}, iters = 0.; z = c; While[(iters < maxiter) && (Abs@z < 2),

我试图有两个面板,左侧显示一个图形和两个定位器,右侧显示定位器定义的区域中的放大版本

我试过了

ClearAll[mndpt];
mndpt = Compile[{{c, _Complex}, {maxiter, _Integer}},
   Module[{z, iters},
        iters = 0.;
        z = c;
            While[(iters < maxiter) && (Abs@z < 2),
                iters++;
                z = z^2 + c];
        Sqrt[iters/maxiter]],
   {{z, _Complex}},
   CompilationTarget \[Rule] "C",
   RuntimeOptions \[Rule] "Speed"];
此时,右侧面板不起作用:

我的问题是,为什么会这样?如您所见,它抱怨“DensityPlot::pllim:Range规范{x,-1,0}的形式不是{x,xmin,xmax}。”这让我感到困惑。事实上,我普遍感到困惑。发生了什么事?某种范围界定问题?评估问题?我怎样才能让它工作呢?这可能很简单,但我从来没有真正理解过前端的东西

编辑:原来这个问题是由于(希望是暂时的)我的愚蠢急剧增加。正如Simon在评论中指出的,删除两个
Dynamics
(这是我为了完成这项工作而盲目添加的)使一切正常。就是

    Manipulate[
 Grid[
  {{DensityPlot[mndpt[x + y*I, 200],
        {x, -2, 1}, {y, -1.5, 1.5},
        PlotRange \[Rule] {0, 1}, PlotPoints \[Rule] 80, 
     ColorFunction \[Rule] "Rainbow"],
    DensityPlot[mndpt[x + y*I, 200],
        {x, p1[[1]], p2[[1]]},{y, p1[[2]], p2[[2]]},
        PlotRange \[Rule] {0, 1}, PlotPoints \[Rule] 80, 
     ColorFunction \[Rule] "Rainbow"]}}],
 {{p1, {-1, -1}}, Locator}, {{p2, {0, 1}}, Locator}]
做正确的事情:

所以,谁知道为什么我在开始的几次都没有成功


另一方面,原始案例中的消息,即“DensityPlot::pllim:Range specification{x,-1,0}不是{x,xmin,xmax}的形式。”更令人费解。我认为Leonid也在一篇评论中解释了这一点(简单地说,尝试
ClearAttributes[Dynamic,ReadProtected]
然后
。由于我对前端编程的理解可以忽略不计,我不会在这里解释,因此如果有人给出解释,我们将不胜感激。

如问题注释中所述,如果从第二个
DensityPlot
的范围中删除
Dynamic
代码,代码工作正常。
动态
通常不需要在
操作
的主体中,因为它自动包装在动态构造中。尽管如此,对于更细粒度的控制,可以使用它来更新表达式的哪些部分

创建错误的原因是,绘图范围的形式应为
{x,xmin,xmax}
,带有
x
a
Symbol
xmin
xmax
数字。在列表周围环绕
Dynamic
,会更改标题并打断绘图

错误不明显的原因是错误消息有点混乱:

范围规范{x,-1,0}的形式不是{x,xmin,xmax}

从表面上看,这看起来很疯狂,但一旦你意识到(正如Leonid所指出的那样)
Dynamic
是一个包装器,它有一个
makebox
定义,当输出到笔记本电脑时,它是不可见的。要看到这一点,请看

In[1]:= FormatValues[Dynamic]
Out[1]= {HoldPattern[MakeBoxes[BoxForm`x$_Dynamic, StandardForm]] :> (DynamicModule; 
           DynamicDump`ControlToBoxes[BoxForm`x$, StandardForm]), 
        <<snip: same but for TraditionalForm>>}

放下两个
动态
s,一切正常。@Simon噢,哇,谢谢!实际上我把它们放在那里是因为“它不起作用”,我开始随机添加东西,直到它起作用。谁知道我做了什么。。。把你的评论作为回答,这样我就可以接受了。另外,如果你知道为什么
Dynamic
s会把事情搞砸,我想知道。@Simon好的,可能是因为
Dynamic
有属性
HoldFirst
。或者?@acl
Dynamic
(与许多其他命令一样)通过
UpValues
在其上重新定义了
makebox
(从
Dynamic
中删除
ReadProtected
属性后,您可以看到它们)。这也会影响使用和错误消息。@acl如果Simon给出答案,我会很高兴,因为是他回答了这个问题。然后,要么他在他的答案中加入了我们讨论的一部分,要么我可以编辑他的答案。巧合的是,在你提交答案后,我几乎立刻看到了这一点。看来我在你提交答案14秒后投票并接受了你的答案,我怀疑这一定是一个记录@acl:这给我赢得了一个机会——懒惰是值得的!
In[1]:= FormatValues[Dynamic]
Out[1]= {HoldPattern[MakeBoxes[BoxForm`x$_Dynamic, StandardForm]] :> (DynamicModule; 
           DynamicDump`ControlToBoxes[BoxForm`x$, StandardForm]), 
        <<snip: same but for TraditionalForm>>}
mndpt = Compile[{{c, _Complex}, {maxiter, _Integer}},
   Module[{z = c, iters = 0.0},
    While[(iters < maxiter) && (Abs@z < 2), iters++; z = z^2 + c];
    Sqrt[iters/maxiter]], CompilationTarget -> "C", 
   RuntimeOptions -> "Speed"];

opts = Sequence[PlotPoints -> 80, ColorFunction -> "Rainbow", 
   ImageSize -> Medium, ImagePadding -> {{30, 5}, {20, 5}}];

fixed = DensityPlot[mndpt[x + y*I, 200], {x, -2, 1}, {y, -1.5, 1.5}, 
   PlotPoints -> 120, Evaluate[opts]];

Manipulate[Grid[{{fixed, DensityPlot[mndpt[x + y*I, 200],
   {x, p[[1, 1]], p[[2, 1]]}, {y, p[[1, 2]], p[[2, 2]]}, Evaluate[opts]]}}],
 {{p, {{-1, -1}, {0, 1}}}, Locator, ContinuousAction -> False}]