2016-09-24 14 views
1

の組み合わせのような文字列を生成するCheckboxBarを使用すると、このの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 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を置き換えることができることを実現するために、4つの2進数、すなわち0000 = 0、1101 = 11などで8。だから私はこの関数を書いています。

g[{d_, f_, g_, h_}] := 
StringJoin[ 
If[d == 1, "d", ""], If[f == 1, "f", ""], If[g == 1, "g", ""], If[h == 1, "h", ""]]; 

これはうまくいきます。ただし、CheckboxBarはチェックされた項目のみを含むリストを生成します。それに加えて、チェックされたエントリの順序は、最初にチェックするものに基づいて変更されます。

質問:私は、現在のものよりはるかに短く、より簡潔な関数を作ります。私の割り当ての要件であったので、チェックボックスを使用してください。チェックボックスなしでは、私の割り当てがどのくらい簡潔であるかを評価していないので、大丈夫です。私は改善のために改善したいだけです。

+0

thetext = Text [Switch [Total [obj]、0、 "、1、" How One "、 4、 "Use CheckboxBar"、8、...]、{0、5}]は、Text [、{0,5}]の多くのコピーをファクタリングすることによって、より短く簡潔です。重要な理由がない限り、スイッチの選択肢を数値順にソートすると、いくつかのエラーが目立ちやすくなることがあります。これは、Text [{""、 "How"、 "Does One"、 "How Does One"、...} [[Total [obj]]、{0、5}]を使用させるかもしれません。あなたの関数gについては、MapThreadのドキュメントを調べて、それを使ってあなたが現在持っている重複を除外する方法を想像できるかどうかを見てみましょう。 – Bill

答えて

0

CheckboxBarには、ボックスをクリックした順序で要素をリストに追加する(ときどき厄介な)プロパティがあります。この制限を克服するために、CheckboxBarにスローするリスト要素にいくつかの数値を追加し、それらの数値を使用してフェーズを注文することができます。

CheckboxBar[ 
    Dynamic[stringList], 
    { 
    {{1}, "I "} -> "I ", 
    {{2}, "guess "} -> "guess ", 
    {{3}, "this "} -> "this ", 
    {{4}, "works?"} -> "works?" 
    } 
] 

次に、あなたが最初の要素(すなわち、SortBy[stringList, First])によってstringListをソートし、その後で一緒に要素を架線して、文字列を取得することができます:だから私はこのようなCheckboxBarを呼びたい、その後、私は段階phrases = {"I ", "guess ", "this ", "works?"}があるとしApply@@StringJoinを組み合わせたい文字列のリストに追加します。

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

編集

したい場合にも、ダイナミックの第二引数にソートを扱うことができます。そのすべて一緒に入れて、私はこのソリューションを提案しています。これはおそらく少し洗練されています(理解しにくいですが)。

DynamicModule[{ 
    stringList = {}, 
    phrases = {"I ", "guess ", "this ", "works?"} 
}, 
    Column[{ 
    CheckboxBar[ 
     Dynamic[ 
     stringList, 
     Function[{val, expr}, stringList = SortBy[val, First]] 
     ], 
     MapIndexed[{#2, #1} -> #1 &, phrases] 
    ], 
    Dynamic[StringJoin @@ stringList[[All, 2]]] 
    }] 
] 
関連する問題