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

时间:2009-07-24 18:43:18

标签: wolfram-mathematica

好的,我这样做:

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

然后我创建滑块:

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

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

更新 这样做的目的是在移动滑块时进行设置更改。

3 个答案:

答案 0 :(得分:29)

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

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

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

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

答案,我不会在这里透露(因为你应该真的尝试它 自己!)可以解释为动态从未做过任何事情 因为它从未出现在屏幕上。分号禁止在屏幕上显示 动态的外观,并没有出现在屏幕上,评估动态 什么都不做。

更巧妙的是,如果删除所有分号,则打印[]语句(at 至少在我的机器上)仍然保持不变,但现在完全没有 不同的原因。这是因为动态保证的屏幕上放置 它的内容将被评估,但何时将被评估。我的 例子设置一个竞争条件,至少在我的机器在v7中, Shift + Enter评估获胜。

回到你的例子,

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

这不符合你的想法,因为在这种情况下是动态的 没有评估屏幕上显示的内容。

你可以通过......来轻松地演示结果。

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

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

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 here上看到我的帖子(我部分重新制定了此回复)。

答案 1 :(得分: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.}}]\)

所以,如果你说'Dynamic [1]'你在屏幕上得到'3',但它实际上并不是'3' - 它实际上是显示的某种笔记本元素一个'3'。

比较函数的结果是一个类似上面的表达式,它不会计算为True,所以select不接受任何元素,所以你得到一个空集。

答案 2 :(得分:1)

您希望整个初始Select表达式是动态的,因为只要q的值发生更改,您就希望更新所选的子集。您可以通过移动Dynamic外部来完成此操作。试试这个:

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

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