Чтобы вам не приходилось читать все нижеприведенное, суть вопроса заключалась в том, что при использовании пользовательских элементов управления в Control
или Manipulate
необходимо использовать чистые функции .
Как указал WReach, это скрыто в документации Manipulate в конце Scope, Controls .
Таким образом, определение такой функции, как inField[x_Dynamic]
ниже, возможно, если она передана в Control[]
как чистая функция inField[##]&
.
Запутывающим аспектом этого вопроса было то, что мой inField
был настроенным InputField
. И, как указал joebolte, InputField
является резервной позицией по умолчанию Control
, если ей дана бессмысленная функция. Это делает это без какого-либо предупреждения, что делает отладку немного хитрой.
Первоначальный вопрос (слегка изменен с учетом первого пункта WReach)
Давайте определим кастом 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
er * inField
отличается от inField[#]&
?
Есть ли основная причина или это ошибка?
Такое поведение встречается в Mathematica 7 и 8.
Редактировать: Мой мотив для выбора пользовательского inField
заключается в том, чтобы отлавливать и исправлять пользовательские вводы - больше, чем просто проверка, которую обеспечивает InputField
. Э.Г.
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]]