2011-08-21 9 views
7

Cuando uso Manipular que puedo hacer:definir el control como variable en Mathematica

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

En realidad mis controles son muchos y complicados, por lo que yo preferiría tener su definición de la expresión Manipular, al igual que :

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

Pero eso da lugar a un error:

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

¿Por qué no funciona de esa manera?

+1

El ejemplo que nos ha facilitado, y lo que veo en la mayoría de las respuestas es que la complejidad del código es no reducido en absoluto. Algunas de las respuestas crean un código muy complejo que utiliza significativamente más caracteres, un montón de construcciones de alcance extra, etc. Siento que solo estoy mejorando el _layout_ de tu código (cada control en su propia línea, agrupando visualmente los controles relacionados, etc.) en la mayoría de los casos son suficientes. –

+0

A través de las respuestas, entiendo mejor lo que está sucediendo, pero tiene toda la razón: ninguna de las construcciones hace que el código sea realmente más simple. Lo que me vuelve loco es la enloquecida profundidad de anidamiento de los corchetes en mi código. Probablemente esa sea la forma de hacerlo de Lisp, pero ¿no hay una manera de hacer que mis programas sean más lineales? –

+1

@Sjoerd, si aparece un fragmento de código en un lugar, entonces estoy de acuerdo con usted. Hacer esto generalmente tiene sentido si a) estás usando el código en más de un lugar, o b) el código completo se está haciendo demasiado largo para modificarlo fácilmente. Por ejemplo, tengo una computadora portátil con un código 'Manipulate' que no aparece en la pantalla de 13 pulgadas de mi macbook. Tengo que usar un truco como este, o tratar de cargar todo en mi cabeza cada vez que necesite modificarlo.Como ya tengo que pensar mucho sobre el problema que realmente estoy resolviendo, preferiría reducir la complejidad del código agregando algunos caracteres. – acl

Respuesta

10

Este

con = {u, 1, 10}; 
Manipulate[ 
u, 
[email protected] 
] 

funciona. Supongo que no funciona sin el debido Evaluate

Attributes[Manipulate] 

muestra que Manipulate tiene el atributo HoldAll (pero puedo estar equivocado). Para ver el efecto de este atributo, intente esto:

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

Por lo tanto, parece que debido a la HoldAll atributo, Manipulate simplemente no se ve "dentro" con menos que se evalúa de forma explícita.

+1

¡Me ganas * mucho *! Entonces, +1 – Simon

+0

@Simon ¡gracias! +1 para ti también Supongo que terminaré con menos votos positivos de todos modos :) – acl

+0

Gracias, eso funciona cuando copio y pego tu ejemplo en una nueva hoja de trabajo. En mi vieja hoja de trabajo tuve que presionar Mayús + Entrar en cada línea antes de que funcionara, incluso en la línea con control = {u, 1, 10}, que no había cambiado. ¿Por qué tengo que reevaluar las líneas? –

11

Manipulate tiene HoldAll attribute. Puede forzar control para evaluar y todo funciona bien

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

El problema con esto es que la variable u no se localiza adecuadamente, por lo que si ya ha configurado, por ejemplo, u=1 en algún lugar, entonces el Manipulate devolverá un error .

Puede ser mejor si utiliza construcciones de alcance adecuadas, como With o DynamicModule, dependiendo de lo que intente hacer exactamente.

Ésta es quizá una exageración, pero asegura que u es local y se mueve control exterior de la manipulación:

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