6

私は、比較的単純な概念であるべきだと思うことに固執しています。インクリメンタル リスト操作に関して Dynamic[] がどのように機能するかを理解していません。次のステートメントを検討してください。

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

シンプルですよね?ここで、x を変更すると z が動的に更新されるようにします。これが私の試みです:

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 であることがわかります。ただし、各ステートメントが最初の要素を分割することを期待しています。動的リストの操作はかかりません。

私の質問は、なぜこの動作が見られるのか、連続した動的リスト操作をどのように適用できるのかということです。

前もって感謝します。

4

2 に答える 2

5

動的は異常な方法で機能します。参照:なぜこれが機能しないのですか? 選択中の動的

割り当ては、リテラル式が画面に表示されるまでb = Dynamic[First[a]]、リテラル式以外には評価されません。Dynamic[First[a]]

したがって、あなたが書くとき、あなたFirst[b]はその最初の部分Dynamic[First[a]]First[a].

Dynamicある意味、内部機能よりも表示のトリックであるという事実は、軽く見過ごされるべきではありません。willの機能を誤解するDynamicと、多くの混乱とフラストレーションが生じます。それにもかかわらず、あなたの単純な例では、少なくとも視覚的には、これで必要な動作を得ることができます:

b = Dynamic[First[a]]

c = Dynamic[First@First[b]]
于 2012-04-15T08:31:05.690 に答える
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( )を使用することにより、とが評価さ:=れるたびに、定義の時点での値ではなく、の現在の値が使用されることを確認します。また、が変更されるたびに、表示された値が再評価されることを確認します。bcaDynamica

于 2012-04-15T11:06:34.750 に答える