2012-04-15 15 views
6

Ich stecke auf, was ich denke, sollte ein relativ einfaches Konzept sein. Ich verstehe nicht, wie Dynamic [] mit inkrementellen Listenmanipulationen funktioniert. Beachten Sie die folgenden Anweisungen:Mathematica Dynamische Listenmanipulation

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

Einfach richtig? Nun möchte ich z dynamisch aktualisieren, wenn ich x ändere. Hier ist mein Versuch:

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} 

Als ich die Werte in der Liste ein ändern, ich sehe entsprechende Änderung ist b und c; Ich würde jedoch jede Aussage zu Teil das erste Element erwarten. Manipulationen an dynamischen Listen machen nicht aus.

Meine Frage ist, warum wir dieses Verhalten sehen, und wie kann ich aufeinander folgende dynamische Listenmanipulationen anwenden?

Vielen Dank im Voraus.

Antwort

5

Dynamic funktioniert auf eine ungewöhnliche Art und Weise. Siehe: Why won't this work? Dynamic in a Select

Die Zuweisung b = Dynamic[First[a]] bewertet nichts anderes als den literalen Ausdruck Dynamic[First[a]], bis dieser Ausdruck sichtbar auf dem Bildschirm angezeigt werden soll.

Deshalb, wenn Sie First[b] schreiben, fragen Sie nach dem ersten Teil von Dynamic[First[a]], der First[a] ist.

Die Tatsache, dass Dynamic in gewisser Weise eher ein Display-Trick als eine interne Funktionalität ist, sollte nicht leicht übersehen werden. Fehler in der Funktion Dynamic führen zu viel Verwirrung und Frustration. Trotzdem in Ihrem einfaches Beispiel können Sie das Verhalten erhalten Sie wollen, zumindest optisch, mit diesem:

b = Dynamic[First[a]] 

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

Sie haben mich wieder dazu geschlagen :-) – Heike

+0

@Heike Ich dachte, ich würde nur Fetzen abholen. Ich wusste nicht, dass du hier noch Fragen beantwortest. :-) –

+1

Ich checke gelegentlich ein, wenn es auf mma.SE ruhig ist – Heike

2

Sie schon eine Antwort bekommen haben, warum Dynamic nicht, wie Sie funktioniert erwartet, aber ich werde hinzufügen wie zu erreichen, was (glaube ich) Sie wollen:

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 
*) 

Durch die Verwendung von SetDelayed (:=) stellen Sie sicher, dass jedes Mal, b und c ausgewertet werden, der aktuelle Wert von a verwendet wird, eher als der Wert, den es hatte am Punkt der Definition. Und die stellt sicher, dass der angezeigte Wert immer dann neu bewertet wird, wenn a geändert wird.