12

わかりました、私はこれを行います:

Select[Range[1, 20], # > Dynamic[q] &]

次に、スライダーを作成します。

Slider[Dynamic[q], {1, 20}]

そして、それは常に空のセットを返します!なぜ!

更新 これの目的は、スライダーを動かしたときにセットを変更することです。

4

3 に答える 3

32

重要なのは、Dynamic は評価に関して何も直接制御しないことを覚えておくことです。それが行うことは、評価プロパティを持つ画面上にスポットを作成することです。

たとえば、Mathematica の新しいセッションで以下を評価するとしたら...

b=5;
Dynamic[a=b];
b=6;
Print[a];

...では、何が印刷されるのでしょうか? すぐに評価するのではなく、試す前によく考えてください。ヒント...これはトリックの質問ですが、トリックを理解することで、Dynamic が何をしているのかを理解することができます。

ここでは明らかにしませんが (実際に自分で試してみてください!) 答えは、ダイナミックが画面に表示されなかったために何もしなかったという事実によって説明できます。セミコロンは、Dynamic が画面上に表示されるのを妨げており、画面上に表示されなければ、Dynamic の評価は何も達成しません。

もっと微妙なことに、すべてのセミコロンを削除すると、(少なくとも私のマシンでは) Print[] ステートメントは変更されずに残りますが、まったく別の理由で. これは、Dynamic の画面上の配置によって、その内容が評価されることが保証されますが、いつ評価されるかは保証されないためです。私の例では、少なくとも v7 の私のマシンでは Shift+Enter 評価が勝つ競合状態を設定しています。

あなたの例に戻るには、

Select[Range[1, 20], # > Dynamic[q] &]

この場合の Dynamic は、画面に表示されるものを評価していないため、これはあなたが思っているようには機能しません。

次のようにして結果を簡単に示すことができます...

Dynamic[Select[Range[1, 20], # > q &]]

しかし、画面に表示するだけでなく、なんらかの副作用を設定することに関心があったと思います。おそらく、Select を変数に割り当てていたのでしょう。これらの副作用を発生させる方法は 2 つあります。1 つは、それらを Dynamic の 2 番目の引数に入れることです。例えば...

findset[x_] := (myset = Select[Range[1, 20], # > x &])
Slider[Dynamic[q, (q=#; myset = findset[q])&], {1, 20}]

2 つ目は、画面上には表示されるが目立たない Dynamic を生成することです。例えば、

Row[{
    Slider[Dynamic[q], {1, 20}],
    Dynamic[myset = Select[Range[1, 20], # > q &]; ""]
}]

この場合、Dynamic は実際に表示されています。スライダーのすぐ隣に表示されます。しかし、表示されているのは空の文字列であるため、表示されません。それにもかかわらず、Dynamic が持つすべての自動更新プロパティを備えています。

詳細については、Mathematica のドキュメントにある初級および上級のダイナミック チュートリアルを参照してください。comp.soft-sys.math.mathematica に関する私の投稿もここで見ることができます(この回答のために部分的に再構成しました)。

于 2009-10-17T01:32:29.350 に答える
1

の値が変化するSelectたびに選択したサブセットを更新する必要があるため、初期式全体を動的にする必要があります。これを行うには、外側qを移動します。Dynamicこれを試して:

Slider[Dynamic[q], {1, 20}]

Dynamic[Select[Range[1, 20], # > q &]]
于 2009-10-19T14:00:28.047 に答える