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 的出现在屏幕上,并且没有出现在屏幕上,对 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 上的帖子(我对此回复进行了部分重新制定)。

于 2009-10-17T01:32:29.350 回答
2

我认为您想将“动态”排除在选择之外。当我玩它时,这似乎有效:

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 不接受任何元素,所以你得到一个空集。

于 2009-07-24T19:47:11.430 回答
1

您希望整个初始Select表达式是动态的,因为您希望在值q更改时更新选定的子集。您可以通过移动Dynamic外部来做到这一点。试试这个:

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

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