Wolfram mathematica 为了在宏中使用,有没有技巧将两个Item[]表达式组合成一个表达式?
第8.04节。这是在Wolfram mathematica 为了在宏中使用,有没有技巧将两个Item[]表达式组合成一个表达式?,wolfram-mathematica,Wolfram Mathematica,第8.04节。这是在操作仅使用的上下文中 下面是一个简单的示例,使用一个项在UI中的不同位置使用操纵来放置控件 Manipulate[Plot[Sin[z], {z, -Pi, Pi}, ImageSize -> 100], Item[Control[{{x, 0, "x="}, 0, 10, 1,ImageSize->Tiny}],ControlPlacement->Left], Item[Control[{{y, 0, "y="}, 0, 10, 1,ImageSize
操作
仅使用的上下文中
下面是一个简单的示例,使用一个项在UI中的不同位置使用操纵来放置控件
Manipulate[Plot[Sin[z], {z, -Pi, Pi}, ImageSize -> 100],
Item[Control[{{x, 0, "x="}, 0, 10, 1,ImageSize->Tiny}],ControlPlacement->Left],
Item[Control[{{y, 0, "y="}, 0, 10, 1,ImageSize->Tiny}],ControlPlacement->Right]
]
然而,我正在使用Leonid的宏方法(link)来帮助我构建UI控件,所以我想做如下事情
Manipulate[Plot[Sin[z], {z, -Pi, Pi}],
Evaluate@With[{im = ImageSize -> Tiny},
Item[Control[{{x, 0, "x="}, 0, 10, 1, im}],ControlPlacement -> Left],
Item[Control[{{y, 0, "y="}, 0, 10, 1, im}], ControlPlacement -> Right]
]
]
上述方法不起作用,因为我们不再有一个表达式可以使与
一起快乐,它具有语法
With[{x=x0}, expression ]
在上面,2项现在不是一个表达式,而是2
只有当我想使用项
控制放置时,才会出现此问题。否则,我将使用Grid[]
并在网格
中组合我的不同内容,然后问题就解决了
但我当然不能在网格中使用项
来使每个项
位于不同的位置。整个网格
必须位于一个位置
我认为将这两个项目包装在一个序列[]
中可能会起作用,但事实并非如此
问题是:有没有技巧将上述两项组合成一个表达式来表达快乐?
目前,我在我的UI中解决了这个问题,只需将事物分成两个独立的,如下所示:
Manipulate[Plot[Sin[z], {z, -Pi, Pi}],
Evaluate@With[{im = ImageSize -> Tiny},
Item[Control[{{x, 0, "x="}, 0, 10, 1, im}],
ControlPlacement -> Left]
],
Evaluate@With[{im = ImageSize -> Tiny},
Item[Control[{{y, 0, "y="}, 0, 10, 1, im}],
ControlPlacement -> Right]
]
]
Manipulate[
Plot[Sin[z], {z, -Pi, Pi}],
Evaluate @ With[{im = ImageSize -> Tiny},
## &[
Item[Control[{{x, 0, "x="}, 0, 10, 1, im}], ControlPlacement -> Left],
Item[Control[{{y, 0, "y="}, 0, 10, 1, im}], ControlPlacement -> Right]
]
]
]
而且效果很好
但是,当然,在上面,我失去了使用宏名称在许多控件构造代码之间共享的一些好处
2011年12月26日晚上8:37更新
下面是一个例子,在另一个宏中使用一个宏。我认为这是一个搁置的问题。下面显示的技巧对此不起作用。我将尝试解决这个问题:(在实践中,我使用两个级别的宏,因为我在一个级别定义了一些宏,并使用它们在第二个级别构建更高级别的宏。这里我只展示了一个非常简单的示例来说明我的意思)
我几乎可以肯定,我需要一个HoldAll
东西插入到正确的位置来解决这个问题。我会设法弄清楚并在这里报告。咖啡快喝完了;)
晚上9点更新
好的,向导先生告诉我上面的问题。我不应该对内部宏进行求值。我忘了这件事。现在就在这里,它工作得很好:
Manipulate[Plot[Sin[z], {z, -Pi, Pi}],
Evaluate@With[{},
With[{},
## &[
Item[Control[{{x, 0, "x="}, 0, 10, 1}], ControlPlacement -> Left],
Item[Control[{{y, 0, "y="}, 0, 10, 1}], ControlPlacement -> Right]
]
](*close second With*)
](*close first With*)
](*close Manipulate*)
谢谢你的回答,都很有用 不要忘记顺序
和应用
Manipulate[Plot[Sin[z], {z, -Pi, Pi}],
Evaluate[
Sequence @@ With[{im = ImageSize -> Tiny},
Hold[
Item[Control[{{x, 0, "x="}, 0, 10, 1, im}], ControlPlacement -> Left],
Item[Control[{{y, 0, "y="}, 0, 10, 1, im}], ControlPlacement -> Right]
]
]
]]
布雷特的回答让我意识到同样的事情可以做得更简洁,比如:
Manipulate[Plot[Sin[z], {z, -Pi, Pi}],
Evaluate@With[{im = ImageSize -> Tiny},
Item[Control[{{x, 0, "x="}, 0, 10, 1, im}],
ControlPlacement -> Left]
],
Evaluate@With[{im = ImageSize -> Tiny},
Item[Control[{{y, 0, "y="}, 0, 10, 1, im}],
ControlPlacement -> Right]
]
]
Manipulate[
Plot[Sin[z], {z, -Pi, Pi}],
Evaluate @ With[{im = ImageSize -> Tiny},
## &[
Item[Control[{{x, 0, "x="}, 0, 10, 1, im}], ControlPlacement -> Left],
Item[Control[{{y, 0, "y="}, 0, 10, 1, im}], ControlPlacement -> Right]
]
]
]
由于With
没有SequenceHold
属性,我们不能简单地对[Item,Item]进行排序,但我们可以使用#&[Item,Item]
,因为&
延迟了评估。使用序列
,可能类似于:
Manipulate[
Plot[Sin[z], {z, -Pi, Pi}],
Evaluate@With[{im = ImageSize -> Tiny},
Sequence @@ {
Item[Control[{{x, 0, "x="}, 0, 10, 1, im}], ControlPlacement -> Left],
Item[Control[{{y, 0, "y="}, 0, 10, 1, im}], ControlPlacement -> Right]
}
]
]
编辑
相同的方法,但使用不同的宏(警告,这种方式会导致疯狂…)
操纵[
图[Sin[z],{z,-Pi,Pi}],
评估@With[{
control=函数[{var,name,place},
项[Control[{{var,0,name“=”},0,10,1,ImageSize->Tiny}],ControlPlacement->place],
霍德尔
]},
序列@{control[x,“x”,Left],control[y,“y”,Right]}
]]
有趣的变化。这两种版本都有好处还是坏处?@Mr.Wizard我不认为这两种版本都有好处。我的第一次尝试与您的类似,只是我试图避免使用括号和方括号,以及Evaluate@Sequence@@With[…]
的优先级错误。如果没有其他东西的话,它的优点是让我考虑将序列
放在中,这样我就可以看到我认为是“正确的”这样做的方法。(见我的最新答案。)@MrWizard,+100,我现在不确定这是怎么回事,我需要通过手术将它分解并研究它,以找出答案,但它是有效的!谢谢。@Nasser,这和Brett的方法是一样的,只是我用
将序列
放在之外,并使用保持
来确保没有任何过早的评估,尽管我不确定这是否真的需要。请查看我的更新,因为我认为这是一种更干净的方法,因为它不需要Apply
@MrWizard,我现在正试图让您的##&
方法适用于嵌入式宏,这是我真正拥有的,不是一个级别,但需要更多的时间。我现在正在煮咖啡,我希望能很快弄明白。我的例子是一个层次,因为我认为这不会有什么不同。我在更新中举例说明了我的意思。但如果可以的话,我会尝试自己解决这个问题,这是一个挑战:)@Nasser,只要去掉你内心的Evaluate
——如果需要的话,我可以添加一个例子。@MrWizard,谢谢!你是对的。我以前被这个(对内部宏进行评估)咬了一口,然后就忘了这一切。是的,就是这样。它现在工作得很好。现在我要把这个加入我的Mathematica大备忘单。