与InputField []结合使用时,这是Control []中的错误吗?

时间:2011-02-07 11:36:19

标签: wolfram-mathematica

因此,您不必阅读以下所有内容,问题的关键是在ControlManipulate中使用自定义控件时,您必须使用pure functions。 正如WReach所指出的,这隐藏在Manipulate documentation at the end of Scope, Controls

因此,定义下面的inField[x_Dynamic]函数很好,只要它作为纯函数Control[]传递给inField[##]&即可。

这个问题的令人困惑的方面是我的inField是自定义InputField。并且,正如joebolte所指出的,InputFieldControl的默认后退位置,如果它被赋予了无意义的功能。它没有任何警告就这样做了,使调试变得有点棘手。


原始问题(略微修改以解决WReach的第1点)

让我们定义一个自定义InputField[]

inField[Dynamic[x_]] := InputField[Dynamic[x], Expression, FieldSize -> 5]

然后在Manipulate[]命令

中使用它
Manipulate[Table[{h, i, j, k}^n, {n, 1, 5}] // TableForm,
 {{h, 1, "hhh"}, inField},
 {{i, 1, "iii"}, inField[#] &},
 {{j, 2, "jjj"}, InputField[#, Expression, FieldSize -> 5] &}, 
 {{k, 3, "kkk"}, InputField[#, Expression, FieldSize -> 20] &},
 ControlPlacement -> Left]

Manipulate

注意单独调用inField[]时不会发生此问题 inFields

但是在使用Control[]时(在Manipulate构造中隐含) Controls

我的问题是:Control为什么inFieldinField[#]&不同? 有潜在的原因还是一个错误? 在Mathematica 7和8中会出现此问题。


修改:我想要自定义inField的动机是捕获并更正用户输入 - 而不仅仅是InputField提供的验证。 E.g。

inFieldRat[Dynamic[var_]] := Dynamic[If[TrueQ[Element[N[var] // Chop, Reals]], 
       var = Rationalize[var, .05], var = Null, var = Null]; 
       InputField[Dynamic[var], Expression, FieldSize -> 5]]

3 个答案:

答案 0 :(得分:2)

尝试更改inField的定义,如下所示:

Clear@inField
inField[x_Dynamic] := InputField[x, Expression, FieldSize -> 5]

最初的定义是从参数中剥离Dynamic包装器,使其立即被评估并在此后保持不变。

我怀疑观察到的行为差异是由于Control中的非标准评估(HoldFirst)。

回应@ Simon的评论

我的误解:我正在解决控制没有正确更新其值的问题,而不是视觉差异。

Manipulate的文档声明该函数必须是纯函数(在 Scope Controls 下)。 Control的文档对此事保持沉默,但可能是因为Manipulate建立在Control之上。 Control[{h, inField}]不是有效表单。但是,在这种情况下,Mathematica不会发出错误消息。相反,它只是完全忽略inField并且表现得好像已经指定了Control[{h}]。我会称这是一个错误。

我怀疑Control要求纯粹的功能,因为符号具有含糊不清的含义。它应该使用符号的下限值还是自己的值(甚至是上升值)?世界资源研究所显然已经找到了own-values答案。如果表达式评估为Control无法理解的内容,我仍然认为消息是合理的。

答案 1 :(得分:1)

只是观察

ControlManipulate屏蔽InputField内发生的任何内容,包含语法错误。

尝试这个荒谬的构造:

Control[{h, InputField[1, 1, 1, 1, pp -> 1, , FieldSize -> MyError]}]

答案 2 :(得分:1)

你的例子有点混淆,因为当域没有评估到任何合理的时候,InputField就是Control返回的。考虑Control[{h, z}](其中z未定义)作为belisarius示例的更引人注目的版本。

inField2 = Function[{x}, InputField[x, Expression, FieldSize -> 5]]

正常工作,但如果您只想设置输入字段的大小,我建议

Manipulate[x, {{x, 5, "x"}, InputField, FieldSize -> 5} ]

编辑:如果您想要一个可以动态重置其自身变量的Manipulate,正如您的编辑所示,我推荐类似

的内容

Manipulate[ If[x < 5, x = 5]; x, {x, 0, 10, InputField} ]