在Mathematica中将控制定义为变量

Lud*_*erl 7 syntax wolfram-mathematica

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

Manipulate[x, {u, 1, 10}]
Run Code Online (Sandbox Code Playgroud)

实际上我的控件很复杂,所以我更喜欢将它们的定义从Manipulate表达式中取出,如下所示:

control = {u, 1, 10}
Manipulate[x, control]
Run Code Online (Sandbox Code Playgroud)

但这确实会导致错误:

Manipulate argument control does not have the correct form for a \
variable specification.
Run Code Online (Sandbox Code Playgroud)

为什么不这样做?

Sim*_*mon 11

ManipulateHoldAll属性.你可以强制control评估,一切正常

control = {u, 1, 10};
Manipulate[x[u], Evaluate[control]]
Run Code Online (Sandbox Code Playgroud)

这个问题是变量u没有正确本地化,所以如果你已经设置了,例如u=1某个地方,那么Manipulate它将返回一个错误.

如果您使用适当的作用域结构可能会更好,例如,With或者DynamicModule取决于您正在尝试做什么.

这可能是矫枉过正,但它确保它u是本地的并且control在操作之外移动:

DynamicModule[{u}, With[{control = {u, 1, 10}}, Manipulate[x[u], control]]]
Run Code Online (Sandbox Code Playgroud)


acl*_*acl 10

这个

con = {u, 1, 10};
Manipulate[
 u,
 Evaluate@con
 ]
Run Code Online (Sandbox Code Playgroud)

确实有效.我想如果没有Evaluate因为它就行不通

Attributes[Manipulate]
Run Code Online (Sandbox Code Playgroud)

显示Manipulate具有属性HoldAll(但我可能是错的).要查看此属性的效果,请尝试以下操作:

SetAttributes[f, HoldAll]
f[con]
f[Evaluate@con]
g[con]
(*
f[con]
f[{u, 1, 10}]
g[{u, 1, 10}]
*)
Run Code Online (Sandbox Code Playgroud)

因此,似乎由于HoldAll属性,除非您明确地评估它,否则Manipulate根本看不到"内部" con.