【问题标题】:How to construct a list of Set's如何构造 Set 的列表
【发布时间】:2010-06-04 21:28:01
【问题描述】:

我有一大组参数 P,它们采用几组不同的值 V_i,并希望使用 ActionMenu[] 来轻松分配 P=V_i,如下所示:

ActionMenu["Label", {"name_1" :> (P = V_1;),..}]

现在的问题是 V_i 的集合很大而且不是静态的,所以我不想手动编写一个长列表{"opt_1" :> (P = V_1;),..},而是想生成它。

我完全不知道该怎么做。一般的方法是这样的

Thread@RuleDelayed[listOfNames,listOfActions]

listOfActions 应该是这样的

Thread@Set[repeatedListOfP,listOfV_i]

但这不起作用。由于Set[] 是一个非常特殊的功能,我的其他常用方法都不起作用(构建Table[]、替换标题等)。您如何构建Set[] 操作列表?

【问题讨论】:

  • 如果这不是问题的基础,您能否提炼出其中的 ActionMenu 部分?
  • 是的,与此同时,我已经通过使用 SetterBar 和 Dynamic 解决了这个问题,无论如何这在美学上更令人愉悦。不过,仍然有兴趣获取 Set[] 操作列表。

标签: wolfram-mathematica


【解决方案1】:

您的问题可能还有更多我尚未深入了解的问题,但也许这会让您走上正轨。

这个

MapThread[Hold[#1 = #2]&, {{a, b, c}, {1, 2, 3}}]

返回一个未评估的“Set”列表,如下所示:

{Hold[a = 1], Hold[b = 2], Hold[c = 3]}

如果您在上面调用 ReleaseHold,那么分配实际上会发生。

更多信息请点击此处:
Mathematica: Unevaluated vs Defer vs Hold vs HoldForm vs HoldAllComplete vs etc etc

【讨论】:

  • 你已经用“......那么任务实际上会发生”一针见血。我需要 Mathematica 给我一个 {(a=1);,(b=2);,...} 的文字列表,无需评估,但也没有任何 Hold[] 结构留在其中。
【解决方案2】:

当我想要拥有具有副作用的RuleDelayed 应用程序时,我使用了另一种解决方案。您使用不同的头部替换Set,直到您的表达式位于RuleDelayed 表单的右侧(它将由RuleDelayedHoldRest 属性保存)然后替换Set 回来了。当我这样做时,我喜欢使用 Module 为我创建一个独特的符号。这样您就不必使用Defer,这是一个比Unevaluated 更令人不快的结构。

这是一个例子:

Module[{set},
 Attributes[set] = Attributes[Set];

 With[{rhs = MapThread[set, Unevaluated[{{x, y, z}, {1, 2, 3}}]]},
  "name1" :> rhs /. {set -> Set, List -> CompoundExpression}]]

set 符号被赋予与Set 相同属性的原因以及Unevaluated 存在的原因是为了确保即使有人已经为x、@ 987654335@或z

另一种可能性是将所有Set 表达式包装为闭包,然后在评估RuleDelayed 时使用Scan 调用它们,如下所示:

With[{thunks = MapThread[Function[{a, b}, (a = b) &, HoldAll],
    Unevaluated[{{x, y, z}, {1, 2, 3}}]]},
 "name1" :> Scan[#[] &, thunks]]

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-10-15
    • 2022-06-14
    • 1970-01-01
    • 2013-02-18
    • 2021-07-18
    • 1970-01-01
    • 2011-10-06
    • 1970-01-01
    相关资源
    最近更新 更多