Выбор динамического списка в другой динамике в Mathematica

Опираясь на решение, предложенное Велизарием в "Управление пользовательской таблицей".

  • Рассмотрим следующую функцию для создания пользовательского табличного представления:

    DataSampleXX[data_, linesNumber_, columnsList_, color1_, color2_, color3_] :=
    
    Grid[
    Join[
         {columnsList}, {Map[Rotate[Text[#], 90 Degree] &, 
          data[[1, columnsList]]]}, data[[2 ;; linesNumber, columnsList]]],
    Background  -> {{{{color1, color2}}, {1 -> color3}}},
    Dividers    -> {All, {1 -> True, 2 -> True, 3 -> True, 0 -> True}},
    ItemSize    -> {1 -> Automatic, Automatic},
    Alignment   -> Top,
    Frame       -> True,
    FrameStyle  -> Thickness[2],
    ItemStyle   -> {Automatic, 
    Automatic, {{1, 1}, 
    {1, Length[data]}} -> Directive[FontSize -> 15, Black, Bold]}
    ];
    
  • И следующие данные:

    soData = {{"col1", "col2", "col3", "col4", "col5", "col6", "col7", 
               "col8", "col9", "col10"}, Range[1, 10], Range[11, 20], 
                Range[21, 30], Range[31, 40]}
    
    
    With[
         {columnsList = {1, 3},
          data = soData,
          linesNumber = 3,
          color1 = LightBlue,
          color2 = LightRed,
          color3 = LightGray},
          DataSampleXX[data, linesNumber, columnsList, color1, color2, color3]]
    

Вывод

  • Я хотел бы интегрировать следующую динамику для подачи аргумента columnsList функции DataSampleXX.

    Manipulate[Sort@Join[Sequence @@ {a, b}], 
               Evaluate[Sequence @@ MapThread[{{#1, {}, ""}, #2, 
               ControlType -> TogglerBar} &, {{a, b},
               Partition[Rule @@@ Transpose[{Range[10], soData[[1]]}], 5]}]], 
               ControlPlacement -> Top]
    

Что я хочу

  • Это должно позволить мне динамически выбирать столбцы (против диапазона столбцов в моем предыдущем вопросе) для отображения с использованием DataSampleXX, но я пока не могу понять, как объединить два механизма.

person 500    schedule 16.06.2011    source источник


Ответы (1)


То, что вы хотите сделать, требует нескольких трюков.

Например:

 Maipulate[ f[ Array[ a, exp], ...], ...]

и подобные конструкции не работают (и это объясняется в документах), потому что a[_] не являются явными в выражении, что затрудняет использование переменного количества элементов управления. Решение, которое я нашел:

Manipulate[ f[#,...], ... ] & @ Array[a, exp]

Другая проблема заключается в том, что конструкция

 Control@( .#. ) &/@ _controls_ 

сам по себе не допускает двумерного раздела, поэтому мы должны использовать обе опции синтаксиса Control@ ( Control@ и { ... }), что не задокументировано.

Другие неприятности вы можете найти в коде ниже.

So:

soData = {{"col01", "col02", "col03", "col04", "col05", "col06", 
          "col07", "col08", "col09", "col10"}, 
           Range[1, 10], Range[11, 20], Range[21, 30], Range[31, 40]};
perRow = 5;
colsel = (# -> Graphics[{#, Disk[]}, ImageSize -> 15]) &/@ColorData[1, "ColorList"];
s[x_] := Style[x, Black, Bold, 12];
ct = ControlType -> PopupMenu;

Manipulate[
   DataSampleXX[soData, linesNumber, Sort@Join[Sequence @@ #], color1,
                                                               color2, color3], 
   Row[
     {Column[
       {Control@{{linesNumber, 2, s@"Lines"}, 
         Range[2, Length@soData[[All, 1]] - 1], ct}}], 
        Spacer[20], 
     Column[
       {Control@{{color1, colsel[[1, 1]], s@"Color 1"}, colsel, ct},
        Control@{{color2, colsel[[2, 1]], s@"Color 2"}, colsel, ct}, 
        Control@{{color3, colsel[[3, 1]], s@"Color 3"}, colsel, ct}}]}], 
   Evaluate[
    Sequence @@ 
     MapThread[{{#1, {}, ""}, #2, ControlType -> TogglerBar} &, 
        {#, Partition[Rule @@@ Transpose[{Range[10], soData[[1]]}], perRow]}]]] &@ 
Array[a, Length[soData[[1]]]/perRow]

введите здесь описание изображения

person Dr. belisarius    schedule 16.06.2011
comment
@Велизарий, это так! Теперь моя проблема в том, что у меня 100 столбцов, поэтому я разделил их на группу из 5, есть ли способ настроить ваш код для этого? Кроме того, я однажды пытался отправить вам электронное письмо на указанный вами адрес в вашем профиле безуспешно. И я хотел бы показать вам, к чему я пришел, используя некоторые из ваших решений! - person 500; 16.06.2011
comment
@ 500 позвольте мне посмотреть, смогу ли я придумать что-нибудь для задач с сотней столбцов. Re моя электронная почта ... она работает. Звучит глупо, но... Вы заменили [dot] и [at] на соответствующие символы ? - person Dr. belisarius; 16.06.2011
comment
@Belisarius, только что отправил тебе электронное письмо на случай, если оно попадет в твой ящик для спама. Я надеюсь, что мой код не будет уродливым для ваших опытных глаз. Большое спасибо за внимание. - person 500; 16.06.2011
comment
@Belisarius, большое спасибо, это работает очень хорошо, я рад, что это было сложно! - person 500; 17.06.2011
comment
@Belisarius, спасибо, теперь я попытаюсь сделать все размеры кнопок одинаковыми, используя другое ваше решение! Тоже выглядит сложно! - person 500; 17.06.2011