Mathematica中的Manipulate []自定义控制器

ins*_*ect 6 wolfram-mathematica

我已经创建了一个函数test [],如果需要的话,它也可以是一个符号测试,我试图在一个操作中实现它.test []看起来像这样:

test[]:=Button["Label",Functionality[]];
Run Code Online (Sandbox Code Playgroud)

如果直接在Manipulate []中使用,这将返回错误,但如果它包含在Dynamic或Evaluate中,则会起作用.

Manipulate[content,test[]];
Run Code Online (Sandbox Code Playgroud)

Manipulate :: vsform:Manipulate参数test []没有正确的变量规范形式.

Manipulate[content,Dynamic[test[]]]
Run Code Online (Sandbox Code Playgroud)

这个工作

Manipulate[content,Evaluate[test]]
Run Code Online (Sandbox Code Playgroud)

请注意,虽然这有效,但测试不是一个功能

Manipulate[content,Evaluate[test[]]]
Run Code Online (Sandbox Code Playgroud)

这适用于我的Mac,但不是我的PC在工作...

我认为这个问题与Manipulate是HoldAll有关,但是不明白为什么Dynamic []应该解决这个问题.此外,Evaluate []只会在某些时候起作用.

那么,为什么Dynamic []或Evaluate []是必要的呢?查看高级操作教程的自定义控制器部分,我看不到对此问题的引用,并且在其他地方找不到任何内容.

Sza*_*lcs 8

您可以内联Button而不是使用单独的test[]函数.否则,你最后一个例子,Manipulate[content,Evaluate[test[]]],确实显示出在数学8.我的机器上的按钮应该有平台(Windows或Mac)之间没有什么区别.

如果你做的事情与Manipulate默认提供的东西有很大的不同,你可能会发现从头开始构建它更方便Dynamic(这是我通常做的).


这是一个如何将一些按钮包含为控制器的示例.

首先,设置一些内容显示在Manipulate:

rotate90[{x_, y_}] := {-y, x}

koch[p1_, p2_, n_] := {koch[p1, p1 + (p2 - p1)/3, n - 1], 
  koch[p1 + (p2 - p1)/3, (p1 + p2)/2 + Sqrt[3]/6 rotate90[p2 - p1], 
   n - 1], koch[(p1 + p2)/2 + Sqrt[3]/6 rotate90[p2 - p1], 
   p2 - (p2 - p1)/3, n - 1], koch[p2 - (p2 - p1)/3, p2, n - 1]}

koch[p1_, p2_, 0] := Line[{p1, p2}]

snowflake[n_] := 
 Graphics[{koch[{0, 0}, {1, 0}, n], 
   koch[{1, 0}, {1/2, -Sqrt[3]/2}, n], 
   koch[{1/2, -Sqrt[3]/2}, {0, 0}, n]}]
Run Code Online (Sandbox Code Playgroud)

然后设置Manipulate自己:

Manipulate[snowflake[n], {{n, 2}, ControlType -> None}, 
 Style["A Koch snowflake", Bold], Delimiter, 
 Row[{Button["+", n++], Button["-", n = Max[n - 1, 0]]}]]
Run Code Online (Sandbox Code Playgroud)

Mathematica图形


这是一个示例,表明即使Button在单独的函数中定义它也可以:

SetAttributes[paletteButton, HoldRest]
paletteButton[name_, func_] := 
 Button[name, func, Appearance -> "Palette"]

Manipulate[snowflake[n], {{n, 2}, ControlType -> None}, 
 Style["A Koch snowflake", Bold], Delimiter, 
 Evaluate@paletteButton["+", n++]]
Run Code Online (Sandbox Code Playgroud)

正如您在问题中提到的,这里有必要将函数包装起来Evaluate以获得内联Button.否则Manipulate将无法注意到我们这里有的是控件而不是变量.