在Mathematica中将控制定义为变量

时间:2011-08-21 14:27:54

标签: syntax wolfram-mathematica

当我使用Manipulate时,我可以这样做:

Manipulate[x, {u, 1, 10}]

实际上我的控制很多很复杂,所以我宁愿选择他们的 Manipulate表达式中的定义,如:

control = {u, 1, 10}
Manipulate[x, control]

但这确实会导致错误:

Manipulate argument control does not have the correct form for a \
variable specification.

为什么不这样做?

2 个答案:

答案 0 :(得分:11)

ManipulateHoldAll attribute。您可以强制control进行评估,一切正常

control = {u, 1, 10};
Manipulate[x[u], Evaluate[control]]

这个问题是变量u没有正确本地化,所以如果你已经在某处设置了u=1,那么Manipulate将返回错误。< / p>

如果您使用WithDynamicModule等适当的作用域结构可能会更好,具体取决于您正在尝试做什么。

这可能有点矫枉过正,但它确保u是本地的,并将control移到操纵之外:

DynamicModule[{u}, With[{control = {u, 1, 10}}, Manipulate[x[u], control]]]

答案 1 :(得分:10)

con = {u, 1, 10};
Manipulate[
 u,
 Evaluate@con
 ]

确实有效。我想如果没有Evaluate,它就无法工作,因为

Attributes[Manipulate]

表明Manipulate具有属性HoldAll(但我可能错了)。要查看此属性的效果,请尝试以下操作:

SetAttributes[f, HoldAll]
f[con]
f[Evaluate@con]
g[con]
(*
f[con]
f[{u, 1, 10}]
g[{u, 1, 10}]
*)

因此,似乎由于HoldAll属性,Manipulate根本看不到“内部”con,除非您明确评估它。