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后在这里(我部分重新此响应).