因此,您不必阅读以下所有内容,问题的关键是在Control
或Manipulate
中使用自定义控件时,您必须使用pure functions。
正如WReach所指出的,这隐藏在Manipulate documentation at the end of Scope, Controls。
因此,定义下面的inField[x_Dynamic]
函数很好,只要它作为纯函数Control[]
传递给inField[##]&
即可。
这个问题的令人困惑的方面是我的inField
是自定义InputField
。并且,正如joebolte所指出的,InputField
是Control
的默认后退位置,如果它被赋予了无意义的功能。它没有任何警告就这样做了,使调试变得有点棘手。
让我们定义一个自定义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]
注意单独调用inField[]
时不会发生此问题
但是在使用Control[]
时(在Manipulate
构造中隐含)
我的问题是:Control
为什么inField
与inField[#]&
不同?
有潜在的原因还是一个错误?
在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]]
答案 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)
只是观察
Control
和Manipulate
屏蔽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}
]