我已经创建了一个函数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 []只会在某些时候起作用。
那么,为什么动态[]或评估[]必要?查看高级操作教程的自定义控制器部分,我看不到对此问题的引用,也找不到其他任何内容。
答案 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]]}]]
这是一个示例,表明即使在单独的函数中定义了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
将无法注意到我们这里的内容是控件而不是变量。