为什么这不起作用?动态选择

nes*_*983 12 wolfram-mathematica

好的,我这样做:

Select[Range[1, 20], # > Dynamic[q] &]
Run Code Online (Sandbox Code Playgroud)

然后我创建滑块:

Slider[Dynamic[q], {1, 20}]
Run Code Online (Sandbox Code Playgroud)

它总会返回一个空集!为什么!

更新 此目标是在移动滑块时进行设置更改.

Joh*_*ltz 31

关键是要记住,Dynamic不会直接控制任何有关评估的内容.它的作用是在屏幕上创建一个具有评估属性的点.

例如,如果您要在新的Mathematica会话中评估以下内容......

b=5;
Dynamic[a=b];
b=6;
Print[a];
Run Code Online (Sandbox Code Playgroud)

......那会打印什么?而不是立即评估它,在尝试之前考虑一下.提示......这是一个技巧问题,但理解这个技巧会让你开始思考Dynamic正在做什么.

答案,我在这里不会透露(因为你应该自己尝试一下!)可以解释为Dynamic从未做过任何事情,因为它从未出现在屏幕上.分号禁止动态的屏幕外观,并且没有出现在屏幕上,动态的评估完成任何事情.

更巧妙的是,如果删除所有分号,Print []语句(至少在我的机器上)仍然保持不变,但现在出于完全不同的原因.这是因为动态的屏幕上的位置保证其内容将被评估,但不是他们将进行评估.我的例子设置了一个竞争条件,至少在我的机器v7中,Shift + Enter评估获胜.

回到你的榜样,

Select[Range[1, 20], # > Dynamic[q] &]
Run Code Online (Sandbox Code Playgroud)

这不会像你想象的那样工作,因为在这种情况下,Dynamic不会评估屏幕上显示的内容.

你可以通过做...来简单地证明结果

Dynamic[Select[Range[1, 20], # > q &]]
Run Code Online (Sandbox Code Playgroud)

但我会假设你不仅仅对在屏幕上显示它感兴趣,而是设置某种副作用.也许您将Select指定给变量.有两种方法可以使这些副作用发生.一个是将它们放在Dynamic的第二个参数中.例如...

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

第二个是制作一个动态,它有一个屏幕外观,但一个不明显.例如,

Row[{
    Slider[Dynamic[q], {1, 20}],
    Dynamic[myset = Select[Range[1, 20], # > q &]; ""]
}]
Run Code Online (Sandbox Code Playgroud)

在这种情况下,Dynamic实际显示.它显示在Slider旁边.但你没有看到它,因为它显示的是一个空字符串.尽管如此,它具有Dynamic所具有的所有自动更新属性.

有关更多信息,请阅读Mathematica文档中的开始和高级动态教程.您还可以看到我的comp.soft-sys.math.mathematica后在这里(我部分重新此响应).