好的,我这样做:
Select[Range[1, 20], # > Dynamic[q] &]
然后我创建滑块:
Slider[Dynamic[q], {1, 20}]
它总是会返回一个空集!为什么!
更新 这样做的目的是在我移动滑块时更改设置。
好的,我这样做:
Select[Range[1, 20], # > Dynamic[q] &]
然后我创建滑块:
Slider[Dynamic[q], {1, 20}]
它总是会返回一个空集!为什么!
更新 这样做的目的是在我移动滑块时更改设置。
关键是要记住 Dynamic 不直接控制任何有关评估的内容。它的作用是在屏幕上创建一个具有评估属性的点。
例如,如果您要在新的 Mathematica 会话中评估以下内容...
b=5;
Dynamic[a=b];
b=6;
Print[a];
...那么会打印什么?与其立即评估它,不如在尝试之前考虑一下。提示...这是一个技巧问题,但理解技巧会让您了解 Dynamic 正在做什么。
答案,我不会在这里透露(因为你真的应该亲自尝试一下!)可以解释为 Dynamic 从来没有做任何事情,因为它从来没有出现在屏幕上。分号抑制了 Dynamic 的出现在屏幕上,并且没有出现在屏幕上,对 Dynamic 的评估一无所获。
更巧妙的是,如果您删除所有分号,Print[] 语句(至少在我的机器上)仍然保持不变,但现在出于完全不同的原因。这是因为 Dynamic 在屏幕上的放置保证了它的内容将被评估,但不能保证它们何时被评估。我的示例设置了一个竞争条件,至少在我的 v7 机器上,Shift+Enter 评估获胜。
回到你的例子,
Select[Range[1, 20], # > Dynamic[q] &]
这并不像您认为的那样起作用,因为在这种情况下,Dynamic 不会评估屏幕上显示的内容。
你可以通过做简单地证明结果......
Dynamic[Select[Range[1, 20], # > q &]]
但我假设您不仅对在屏幕上显示它感兴趣,而且对设置某种副作用感兴趣。也许您正在将 Select 分配给一个变量。有两种方法可以使这些副作用发生。一种是将它们放在 Dynamic 的第二个参数中。例如...
findset[x_] := (myset = Select[Range[1, 20], # > x &])
Slider[Dynamic[q, (q=#; myset = findset[q])&], {1, 20}]
第二个是产生一个动态的,它确实有屏幕外观,但不引人注目。例如,
Row[{
Slider[Dynamic[q], {1, 20}],
Dynamic[myset = Select[Range[1, 20], # > q &]; ""]
}]
在这种情况下,动态实际上正在显示。它显示在滑块旁边。但是您看不到它,因为它显示的是一个空字符串。尽管如此,它具有任何 Dynamic 所具有的所有自动更新属性。
有关更多信息,您应该阅读 Mathematica 文档中的初级和高级动态教程。您还可以在此处查看我在 comp.soft-sys.math.mathematica 上的帖子(我对此回复进行了部分重新制定)。
我认为您想将“动态”排除在选择之外。当我玩它时,这似乎有效:
In[20]:= x = 5
Out[20]= 5
In[21]:= Slider[Dynamic[x], {1, 20}]
Out[21]= \!\(\*
SliderBox[Dynamic[$CellContext`x], {1, 20}]\)
In[26]:= (*manually move the slider a bit to the right *)
In[23]:= x
Out[23]= 9.36
In[24]:= Select[Range[1, 20], # > x &]
Out[24]= {10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20}
x = 2 (*slider moves left when I set this*)
Out[25]= 2
编辑:您的实际问题是,“为什么这不起作用”而不是“我如何让它起作用”。这是问题所在:
In[12]:= q = 3
Out[12]= 3
In[13]:= (# > q) &[10]
Out[13]= True
In[14]:= (# > Dynamic[q]) &[10]
(* what you see on the screen looks like an evaluation that is held or something *)
Out[14] = 10 > 3
(* but the full form, which is conveniently what gets copied to the clipboard for
pasting into this answer, is actually this! *)
Out[14]= 10 > \!\(\*
DynamicBox[ToBoxes[$CellContext`q, StandardForm],
ImageSizeCache->{7., {1., 8.}}]\)
因此,如果您说“动态[1]”,您确实会在屏幕上看到“3”,但它并不是真正的“3”——它是某种实际上显示“3”的笔记本元素。
比较函数的结果是一个类似上面的表达式,它的计算结果不为 True,所以 select 不接受任何元素,所以你得到一个空集。
您希望整个初始Select
表达式是动态的,因为您希望在值q
更改时更新选定的子集。您可以通过移动Dynamic
外部来做到这一点。试试这个:
Slider[Dynamic[q], {1, 20}]
Dynamic[Select[Range[1, 20], # > q &]]