2016-09-24 40 views
1

的組合我開始了一些很長的和惱人寫這樣數學:使用CheckboxBar生成一個字符串作爲短語

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也沒關係,因爲我的任務並沒有分級,我的代碼很簡潔。我只是爲了改進而改進它。

+0

thetext = Text [Switch [Total [obj],0,「」,1,「How」,2,「One One」, 4, 「Use CheckboxBar」,8,...],{0,5}]通過分解Text [,{0,5}]的許多副本來縮短和簡化。按照數字順序對開關選項進行排序,除非有一個重要的原因,否則可能會使某些錯誤更加突出。這可以讓你使用Text [{「」,「How」,「One One」,「How One One」,...} [[Total [obj]]],{0,5}]。對於你的函數g,你可以研究MapThread的文檔,看看你能否想象如何用它來分析你現在在g中的重複。 – Bill

回答

0

CheckboxBar有(有時令人討厭的)屬性,將按照您點擊框的順序將元素添加到列表中。爲了克服這個限制,您可以添加一些數字到您投入CheckboxBar的列表元素中,並使用這些數字來排序這些階段。因此,假設我有階段phrases = {"I ", "guess ", "this ", "works?"},那麼我想打電話給CheckboxBar是這樣的:由第一要素排序stringList(即SortBy[stringList, First]),然後通過元素串在一起

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

接下來,你可以得到你的字符串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]]] 
    }] 
] 

編輯

您也可以處理排序在動態的第二個參數,如果你想。這可能是一個更清潔(雖然有點難以理解):

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]]] 
    }] 
] 
相關問題