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

时间:2012-01-13 05:13:38

标签: wolfram-mathematica

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

test[]:=Button["Label",Functionality[]];

如果直接在Manipulate []中使用,则会返回错误,但如果它包含在Dynamic或Evaluate中,则会有效。

Manipulate[content,test[]];
  

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

Manipulate[content,Dynamic[test[]]]

这个有效

Manipulate[content,Evaluate[test]]

请注意,虽然这有效,但测试不是函数

Manipulate[content,Evaluate[test[]]]

这适用于我的Mac,但不适用于我的PC ...

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

那么,为什么动态[]或评估[]必要?查看高级操作教程的自定义控制器部分,我看不到对此问题的引用,也找不到其他任何内容。

1 个答案:

答案 0 :(得分:8)

您可以内联Button,而不是使用单独的test[]功能。否则你最后一个例子,Manipulate[content,Evaluate[test[]]] 在我的机器上显示Mathematica 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]}]

然后设置Manipulate本身:

Manipulate[snowflake[n], {{n, 2}, ControlType -> None}, 
 Style["A Koch snowflake", Bold], Delimiter, 
 Row[{Button["+", n++], Button["-", n = Max[n - 1, 0]]}]]

Mathematica graphics


这是一个示例,表明即使在单独的函数中定义了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++]]

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