Wolfram mathematica Mathematica:使用CheckboxBar生成一个字符串作为短语的组合

Wolfram mathematica Mathematica:使用CheckboxBar生成一个字符串作为短语的组合,wolfram-mathematica,Wolfram Mathematica,我一开始写了一些很长很烦人的东西,像这样 Manipulate[ thetext = Switch[Total[obj], 0, Text["", {0, 5}], 1, Text["How", {0, 5}], 2, Text["Does One", {0, 5}], 4, Text["Use CheckboxBar", {0, 5}], 8, Text["=A=", {0, 5}], 3, Text["How Does One", {0, 5}], 5, Text["How Use Che

我一开始写了一些很长很烦人的东西,像这样

Manipulate[
thetext = Switch[Total[obj],
0, Text["", {0, 5}],
1, Text["How", {0, 5}],
2, Text["Does One", {0, 5}],
4, Text["Use CheckboxBar", {0, 5}],
8, Text["=A=", {0, 5}],

3, Text["How Does One", {0, 5}],
5, Text["How Use CheckboxBar", {0, 5}],
9, Text["How =A=", {0, 5}],
6, Text["Does One Use CheckboxBar", {0, 5}],
10, Text["Does One =A=", {0, 5}],
12, Text["Use CheckboxBar =A=", {0, 5}],

7, Text["How Does One Use CheckboxBar", {0, 5}],
11, Text["How Does One =A=", {0, 5}],
13, Text["How Use CheckboxBar =A=", {0, 5}],
14, Text["Does One Use CheckboxBar =A=", {0, 5}],

15, Text["How Does One Use CheckboxBar =A=", {0, 5}]];

Graphics[thetext],
{{obj, {1, 2, 4, 8}, "Text"}, {1 -> "How", 2 -> "Does One", 
4 -> "Use CheckBoxBar", 8 -> "=A="}, CheckboxBar}] 
但我很快意识到我可能可以用四个二进制数字替换1,2,4,8,即0000=0、1101=11等。因此我编写了以下函数:

g[{d_, f_, g_, h_}] := 
StringJoin[
If[d == 1, "d", ""], If[f == 1, "f", ""], If[g == 1, "g", ""], If[h == 1, "h", ""]];
这很好用。但是,CheckboxBar生成的列表仅包含选中的条目。除此之外,选中条目的顺序会根据您首先选中的条目而改变

问题:我应该如何制作一个比我现在拥有的要短得多/更简洁的函数。最好使用checkboxbar,因为这是我任务中的一项要求。没有checkboxbar也可以,因为我的作业不是根据代码的简洁程度来评分的。我只是想为了改进而改进它

CheckboxBar有一个属性(有时很烦人),它将按单击框的顺序向列表中添加元素。为了克服这一限制,您可以将一些数字添加到您放入CheckboxBar的列表元素中,并使用这些数字对阶段进行排序。因此,假设我有阶段
短语={“I”,“guess”,“this”,“works?”}
,那么我想像这样调用CheckboxBar:

CheckboxBar[
  Dynamic[stringList],
  {
    {{1}, "I "} -> "I ",
    {{2}, "guess "} -> "guess ",
    {{3}, "this "} -> "this ",
    {{4}, "works?"} -> "works?"
  }
]
接下来,您可以通过按第一个元素排序
stringList
(即,
SortBy[stringList,first]
),然后通过
Apply
ing(
@
StringJoin
)将元素串在一起来获取字符串。综上所述,我提出以下解决方案:

DynamicModule[{
  stringList = {},
  phrases = {"I ", "guess ", "this ", "works?"}
},
  Column[{
    CheckboxBar[
      Dynamic[stringList], 
      MapIndexed[{#2, #1} -> #1 &, phrases]
    ],
    Dynamic[StringJoin @@ SortBy[stringList, First][[All, 2]]]
  }]
]
编辑

如果需要,还可以在Dynamic的第二个参数中处理排序。这可能有点干净(尽管有点难以理解):

CheckboxBar有一个属性(有时很烦人),它将按单击框的顺序向列表中添加元素。为了克服这一限制,您可以将一些数字添加到您放入CheckboxBar的列表元素中,并使用这些数字对阶段进行排序。因此,假设我有阶段
短语={“I”,“guess”,“this”,“works?”}
,那么我想像这样调用CheckboxBar:

CheckboxBar[
  Dynamic[stringList],
  {
    {{1}, "I "} -> "I ",
    {{2}, "guess "} -> "guess ",
    {{3}, "this "} -> "this ",
    {{4}, "works?"} -> "works?"
  }
]
接下来,您可以通过按第一个元素排序
stringList
(即,
SortBy[stringList,first]
),然后通过
Apply
ing(
@
StringJoin
)将元素串在一起来获取字符串。综上所述,我提出以下解决方案:

DynamicModule[{
  stringList = {},
  phrases = {"I ", "guess ", "this ", "works?"}
},
  Column[{
    CheckboxBar[
      Dynamic[stringList], 
      MapIndexed[{#2, #1} -> #1 &, phrases]
    ],
    Dynamic[StringJoin @@ SortBy[stringList, First][[All, 2]]]
  }]
]
编辑

如果需要,还可以在Dynamic的第二个参数中处理排序。这可能有点干净(尽管有点难以理解):


Text=Text[Switch[Total[obj],0,”,1,“How”,2,“Does One”,4,“Use CheckboxBar”,8,…,{0,5}]通过分解文本的多个副本[,{0,5}],变得更短、更简洁。除非有重要的理由不这样做,否则将开关选项按数字顺序排序可能会使某些错误更加突出。这可能会让您使用文本[{”、“如何”、“一个如何”、“一个如何”、…}[[Total[obj]]]、{0,5}]。对于函数g,您可以研究MapThread的文档,看看您是否可以想象如何使用它来消除g中的重复。Text=Text[Switch[Total[obj],0,”,1,“how”,2,“Does One”,4,“use CheckboxBar”,8,…,{0,5}通过分解文本的多个副本,[,,{0,5}]。除非有重要原因,否则将开关选项按数字顺序排序可能会使某些错误更加突出。这可能会让您使用文本[{”、“如何”、“一个如何”、“一个如何”,…}[[Total[obj]],{0,5}].对于函数g,您可以研究MapThread的文档,看看您是否可以想象如何使用它来消除g中的重复。