这与这个问题有点关系
但是上面的问题没有回答我的问题,因为它讨论了完整的控制定义.(我也尝试过那里展示的一些技巧,但它们对我的问题不起作用).
我现在只询问部分控件的定义.(使用这种论坛格式也很难跟进一个老问题.因为使用微小的评论区域,很难提出更多的问题,并且更像是在询问空间较大的新问题时,可以粘贴代码和图片).
我所做的所有尝试都不起作用.我将从简单的例子开始解释这个问题.
假设有人想写
Clear["Global`*"];
Manipulate[Plot[f*g, {x, -1, 1}],
Grid[{
{Style["f(x)="],
PopupMenu[Dynamic[f], {x, x^2, x^3}, ImageSize -> Tiny]},{Style["g(x)="],
PopupMenu[Dynamic[g], {x, x^2, x^3}, ImageSize -> Tiny]}
}]
]
Run Code Online (Sandbox Code Playgroud)
您可以看到每个控件定义中都存在重复的代码重复.(像ImageSize,Spacings->和许多其他装饰设置之类的东西会反复重复每个控件.

如果我能写出类似的东西,那会是多么美好的事情
Manipulate[Plot[f*g, {x, -1, 1}],
Grid[{
{Style["f(x)="], PopupMenu[Dynamic[f], Evaluate@Sequence@v]},
{Style["g(x)="], PopupMenu[Dynamic[g], Evaluate@Sequence@v]}
}],
Initialization :>
(
v = {{x, x^2, x^3}, ImageSize -> Tiny}
)
]
Run Code Online (Sandbox Code Playgroud)
但这不起作用.我在上面的那一行尝试了许多其他的东西,没有任何作用.喜欢
{Style["f(x)="], PopupMenu[Dynamic[f], v]},
Run Code Online (Sandbox Code Playgroud)
和
{Style["f(x)="], PopupMenu[Dynamic[f], Evaluate@v]}
Run Code Online (Sandbox Code Playgroud)
和
Manipulate[Plot[f*g, {x, -1, 1}],
{{v, {{x, x^2, x^3}, ImageSize -> Tiny}}, None},
Grid[{
{Style["f(x)="], PopupMenu[Dynamic[f], …Run Code Online (Sandbox Code Playgroud) 关于在Mathematica中创建记录的问题已在少数几个地方讨论过,例如Mathematica中的Struct数据类型?.
所有这些方法的问题在于,人们似乎失去了对每个参数进行特定额外检查的能力,就像人们做的那样x_?NumericQ.
我的问题是:在Mathematica中有没有办法制作记录或结构,但是能够在各个元素上使用上述检查?
我试图找到一种方法来使用,因为我厌倦了在它们上面调用10个参数的函数(有时候一个人无法避免这种情况),即使我试图使每个函数都非常具体,最小化数量参数,一些功能只需要很多参数来完成特定的工作.
首先,我展示了我所知道的三种方法.
foo[p_]:=Module[{},
Plot[Sin[x],{x,from/.p,to/.p}]
]
p={from->-Pi,to->Pi};
foo[p]
Run Code Online (Sandbox Code Playgroud)
优点:安全,好像我将符号'从'更改为其他东西,它仍然有效.如下例所示.
foo[p_]:=Module[{},
Plot[Sin[x],{x,from/.p,to/.p}]
]
p={from->-Pi,to->Pi};
from=-1; (* By accident the symbol from was set somewhere. It will work*)
foo[p]
Run Code Online (Sandbox Code Playgroud)
Clear[p,foo];
foo[p_]:=Module[{},
Print[p];
Plot[Sin[x],{x,p["from"],p["to"]}]
]
p["from"] = -Pi;
p["to"] = Pi;
foo[p]
Run Code Online (Sandbox Code Playgroud)
优点:也是安全的,字符串是不可变的.不必担心"从"值的变化.但到处都有字符串不太可读?
Clear[p,to,from];
foo[p_]:=Module[{},
Plot[Sin[x],{x,p[from],p[to]}]
]
p[from] = -Pi;
p[to] = Pi;
foo[p]
Run Code Online (Sandbox Code Playgroud)
缺点:如果任何符号'从'或'到'某处被覆盖,将导致问题,如
from=-4; (*accidentally the symbol from is assigned a value*)
foo[p]
Run Code Online (Sandbox Code Playgroud)
所以.我认为方法(1)是最安全的.但现在我失去了这样做的能力:
foo[from_?NumericQ, to_?NumericQ] := Module[{},
Plot[Sin[x], {x, from, to}] …Run Code Online (Sandbox Code Playgroud)