1

I have a list named data that contains lists of arbitrary size,

data={{0.5, 0.5}, {}, {0.5, 0.5, 0.5}, {}, {}, {}, {}, {}, {}, {}}

I now want to generate for each sub-list the appropriate number of sliders (for the empty sets none, though I believe they are easy to skip). However, I am not sure if this is even possible.

In my quest I stumbled upon this thread, Manipulate with a variable number of sliders, which allows me to generate sliders for one sub-list,

Dynamic[Grid[
Table[With[{i = i}, {Slider[Dynamic[data[[1]][[i]]]], 
 Dynamic[data[[1]][[i]]]}], {i, Length[data[[1]]]}]]] 

This works perfectly fine if I use a constant as an index for data, in this case 1.

However, if I want to extend this by using a for loop or a table to make that index variable, say

Table[Dynamic[Grid[
Table[With[{i = i}, {Slider[Dynamic[data[[k]][[i]]]], 
 Dynamic[data[[k]][[i]]]}], {i, Length[data[[k]]]}]]],{k,1,1}]

the k gets marked red and the code fails. Is it even possible to generate sliders this way? I imagine the reason that the code fails is that Dynamic requires the object under consideration to remain constant, but is there a way around this?

1 Answers1

4

May be something like this would work:

   data2 = Select[data, Length@# > 1 &];

Dynamic[Column@
  Flatten@Table[
    With[{i = i, k = k}, {Slider[Dynamic[data2[[k]][[i]]]], 
      Dynamic[data2[[k]][[i]]]}], {k, 1, Length@data2, 1}, {i, 1, 
     Length@data2[[k]]}]]

Second option: To work directly with data you can try this:

 data = {{0.5, 0.5}, {}, {0.5, 0.5, 0.5}, {}, {}, {}, {}, {}, {}, {}};
 index = Complement[Range[Length@data], Position[data, {}] // Flatten];

Dynamic[Column@
  Flatten@Table[
    With[{i = i, k = k}, {Slider[Dynamic[data[[k]][[i]]]], 
      Dynamic[data[[k]][[i]]]}], {k, index}, {i, 1, 
     Length@data[[k]]}]]
Basheer Algohi
  • 19,917
  • 1
  • 31
  • 78