Определить контроль как переменную в Mathematica - PullRequest
7 голосов
/ 21 августа 2011

Когда я использую Манипулирование, я могу сделать:

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

На самом деле мои элементы управления многочисленны и сложны, поэтому я бы предпочел исключить их определение из выражения Манипуляции, например:1005 *

Но это приводит к ошибке:

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

Почему это не работает?

Ответы [ 2 ]

11 голосов
/ 21 августа 2011

Manipulate имеет атрибут HoldAll .Вы можете заставить control оценить и все работает нормально

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

Проблема в том, что переменная u не локализована должным образом, поэтому, если вы уже установили, например, u=1тогда Manipulate вернет ошибку.

Возможно, будет лучше, если вы будете использовать соответствующие ограничивающие конструкции, такие как With или DynamicModule, в зависимости от того, что именно вы пытаетесь сделать.

Это может быть излишним, но это гарантирует, что u является локальным и перемещает control за пределы манипуляции:

DynamicModule[{u}, With[{control = {u, 1, 10}}, Manipulate[x[u], control]]]
10 голосов
/ 21 августа 2011

Это

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, если вы явно не оценили его.

...