How to | 式をDynamicやManipulateの中で評価する方法
DynamicおよびManipulateはうまく作動させるために不可欠な保持属性を持つ.しかし,これらの保持属性が行いたい他の構造的な操作を妨げることがある.この「How to」ドキュメントでは,Dynamic,Manipulate,およびその他の保持される構造のための便利なアプローチをいくつか紹介する.
これらの例題の性質上,出力の中にはファイルに保存されないものもある.これらの例題を理解するためには,読み進みながらそれぞれの入力を評価することをお勧めする.
numbers = RandomReal[1, 5];Dynamic[numbers]次の入力では,最初のスライダーが動的に数字のリストの値を変え,2番目のスライダーが2番目の値を変更する,というふうに順に変更を行うようなスライダーのリストを作成する.
{Slider[Dynamic[numbers[[1]]]], Slider[Dynamic[numbers[[2]]]], Slider[Dynamic[numbers[[3]]]], Slider[Dynamic[numbers[[4]]]], Slider[Dynamic[numbers[[5]]]]}このようなスライダーのリストをTable等を使ってもっと簡単に作成したい場合があるかもしれない.DynamicのHoldFirst属性が邪魔になってTable変数の値が式に使われるのを妨げることがある.したがってこの試みは失敗し,numbers[[1]],numbers[[2]]等の代りに文字通りnumbers[[i]]が現れることになる.iのシンタックスカラーリングがこの危険があることを警告していることに注目されたい:
Table[Slider[Dynamic[numbers[[i]]]], {i, 1, 5}]//InputFormこの問題を克服するために,スコープ構文であるWithを使って局所変数iのすべての場合をその対応する値で即座に置き換えることができる:
Table[With[{i = i}, Slider[Dynamic[numbers[[i]]]]], {i, 1, 5}]//InputFormInputFormラッパーを取り除くことによってフォーマットされたスライダーを得ることができる:
Table[With[{i = i}, Slider[Dynamic[numbers[[i]]]]], {i, 1, 5}]Dynamic[numbers]いくつかのコントロールをまとめて構築する際に,同じ方法をManipulateでも取ることができる.以下は最初のスライダーが他にいくつのスライダーを表示するかを指定するManipulateである.他のスライダーは見やすいようにPanelでラップされている.ここでもスライダーを作成するTableの中でWithが使用されていることに注目されたい:
Manipulate[Take[lis, n], {{lis, ConstantArray[0, 20]}, ControlType -> None}, {n, 1, 20, 1}, Dynamic[Panel[Column[Table[With[{i = i}, Slider[Dynamic[lis[[i]]]]], {i, n}]]]]]以下は同じような例で,データの変数に関連するチェックボックスの数が他のManipulateコントロールの値に基づいて変化するというものである:
Manipulate[Grid[Take[data, h, w]], {{data, RandomInteger[1, {10, 20}]}, ControlType -> None}, {{w, 10}, 1, 20, 1}, {{h, 3}, 1, 10, 1}, Dynamic[Panel[Grid[Table[With[{i = i, j = j}, Checkbox[Dynamic[data[[i, j]]], {0, 1}]], {i, h}, {j, w}]]]]]指標付きのコントロールを持つManipulateを構築する:
Manipulate[{x[1], x[2], x[3]}, {x[1], 0, 1}, {x[2], 0, 1}, {x[3], 0, 1}]指標付きのコントロールに必要な構造を直接構築することによって,任意数のコントロールを持つManipulateを構築することもできる.この場合は,Block を使ってxの任意の大域的な定義がこれらの構造的な操作を邪魔することがないようにする:
Block[{x, n = 10},
Manipulate @@ {
Table[x[i], {i, n}],
Sequence @@ Table[{x[i], 0, 1}, {i, n}]}]