2012-04-15 15 views
6

Estoy atrapado en lo que creo que debería ser un concepto relativamente simple. No entiendo cómo funciona Dynamic [] con respecto a las manipulaciones de la lista incremental. Considere las siguientes afirmaciones:Mathematica Dynamic List Manipulation

In[459]:= x={{1,2}}; 
In[462]:= y=First[x] 
Out[462]= {1,2} 
In[463]:= z=First[y] 
Out[463]= 1 

Simple right? Ahora, quiero que z se actualice dinámicamente cuando cambio x. Aquí está mi intento:

In[458]:= a={{1,2}}; 
In[452]:= b=Dynamic[First[a]] 
Out[452]= {1,2} 
In[449]:= c=Dynamic[First[b]] 
Out[449]= {1,2} 

Como cambio los valores en la lista a, veo que el cambio correspondiente es b y c; sin embargo, esperaría que cada declaración a Parte sea el primer elemento. Manipulaciones en listas dinámicas no están tomando.

Mi pregunta es ¿por qué vemos este comportamiento y cómo puedo aplicar manipulaciones consecutivas de la lista dinámica?

Gracias de antemano.

Respuesta

5

La dinámica funciona de forma inusual. Ver: Why won't this work? Dynamic in a Select

La asignación b = Dynamic[First[a]] no evalúa a nada más que a la expresión literal Dynamic[First[a]] hasta que esa expresión se muestre visiblemente en la pantalla. Por favor, cuando escribe First[b] está pidiendo la primera parte de Dynamic[First[a]] que es First[a].

El hecho de que Dynamic es más un truco de visualización que una funcionalidad interna no debe pasarse por alto ligeramente. Si se confunde la función Dynamic se generará mucha confusión y frustración. Sin embargo, en el ejemplo sencillo puede obtener el comportamiento que desea, al menos visualmente, con esto:

b = Dynamic[First[a]] 

c = Dynamic[[email protected][b]] 
+0

Me pegaste de nuevo :-) – Heike

+0

@Heike Pensé que solo estaba recogiendo trozos. No sabía que todavía estabas respondiendo preguntas aquí. :-) –

+1

Me registro de vez en cuando cuando está tranquilo en mma.SE – Heike

2

si ya recibió una respuesta por qué Dynamic no funciona como se esperaba, pero voy a añadir cómo lograr lo que (creo) que desee:

a={{1,2}} 
(* 
==> {{1,2}} 
*) 

b:=First[a];Dynamic[b] 
(* 
==> {1,2} 
*) 

c:=First[b];Dynamic[c] 
(* 
==> 1 
*) 

a={{3,4}} 
(* 
==> {{3,4}} 
-- The displays for b and c now change to {3,4} and 3 
*) 

mediante el uso de SetDelayed (:=) se asegura de que cada vez que se evalúan b y c, se utiliza el valor actual de a, en lugar del valor que tenía en el punto de definición. Y el Dynamic se asegura de que el valor visualizado se reevalúe siempre que se cambie a.