2012-04-15 6 views
6

Я застрял на том, что, по моему мнению, должно быть относительно простой концепцией. Я не понимаю, как Dynamic [] работает с манипуляциями с инкрементным списком. СООБЩИТЕ следующие заявления: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 

Простое право? Теперь я хочу, чтобы z динамически обновлялось при изменении x. Вот моя попытка:

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} 

Как я изменяю значения в списке a, я вижу соответствующее изменение b и c; однако я бы ожидал, что каждый оператор будет Часть первый элемент. Манипуляции в динамических списках не принимаются.

Мой вопрос, почему мы видим это поведение и как я могу применять последовательные манипуляции динамическим списком?

Заранее спасибо.

ответ

5

Динамические работы необычным способом. См.: Why won't this work? Dynamic in a Select

Назначение b = Dynamic[First[a]] не оценивает ничем, кроме буквального выражения Dynamic[First[a]], пока это выражение не будет явно отображаться на экране.

Поэтому, когда вы пишете First[b], вы запрашиваете первую часть Dynamic[First[a]], которая составляет First[a].

Тот факт, что Dynamic в некотором роде больше проявляет трюк, чем внутренняя функциональность, не следует упускать из виду. Ошибка в функции Dynamic приведет к большому путанице и разочарованию. Тем не менее, в вашем простом примере вы можете получить поведение, которое вы хотите, по крайней мере визуально, с этим:

b = Dynamic[First[a]] 

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

Вы избили меня еще раз :-) – Heike

+0

@Heike Я думал, что просто собираю обрывки. Я не знал, что вы все еще отвечаете на вопросы. :-) –

+1

Я периодически проверяю, когда он тихий на mma.SE – Heike

2

Вы уже получили ответ, почему Dynamic не работает, как вы ожидали, но я добавлю как добиться того, что (я думаю) вы хотите:

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

с помощью SetDelayed (:=) вы убедитесь, что каждый раз, когда b и c оцениваются, текущее значение a используется, а не значения, которое он имел в точке определения. И Dynamic гарантирует, что отображаемое значение переоценивается при изменении a.