当我使用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.
为什么不这样做?
答案 0 :(得分:11)
Manipulate
有HoldAll
attribute。您可以强制control
进行评估,一切正常
control = {u, 1, 10};
Manipulate[x[u], Evaluate[control]]
这个问题是变量u
没有正确本地化,所以如果你已经在某处设置了u=1
,那么Manipulate
将返回错误。< / p>
如果您使用With
或DynamicModule
等适当的作用域结构可能会更好,具体取决于您正在尝试做什么。
这可能有点矫枉过正,但它确保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
,除非您明确评估它。