Укажите локальную динамику в сетке

Я хотел бы обновить определенные части a Grid динамически по-разному. Рассмотрим следующий игрушечный пример: у меня две строки: одна должна обновляться одна за другой ( a , b , c ), поскольку эти символы зависят от по разным триггерам; вторая строка зависит от одного единственного триггера ( show ), который позволяет отображать / скрывать некоторые данные.

Теперь я знаю, что могу обернуть всю структуру Grid в Dynamic и даже указать, какие символы нужно отслеживать, поэтому этот пример делает то, что я хочу:

Checkbox[Dynamic[show]]
test = {0, 0};
Dynamic[Grid[{{Dynamic@a, Dynamic@b, Dynamic@c}, 
   If[show, Prepend[test, "test:"], {}]}, Frame -> All],
 TrackedSymbols :> {show}]

Mathematica graphics

Хотя для определенные причины Я хотел бы иметь локально определенный динамический , который применяется только ко второй строке сетки .

Для тех, кто задается вопросом, какая это будет безбожная ситуация, представьте себе следующее: show используется в любом из a , b или ] c , и я НЕ хочу обновлять, когда show изменяется, их изменения зависят от других триггеров. Почему бы тогда не убрать show из символов первой строки? Представьте, я не могу, поскольку показывает, что присутствует в функции, которая используется в a , b или c , и это функция Я не могу легко получить доступ.

Конечно, перенос первого аргумента If в Dynamic здесь не поможет, поскольку сама Grid или любая из ее ячеек не станут dynamic:

Grid[{
  {Dynamic@a, Dynamic@b, Dynamic@c},
  If[Dynamic@show, Prepend[test, "test:"], {}]
  }, Frame -> All]

Кроме того, перенос строки в Dynamic делает данную строку недействительной, поскольку у нее больше нет заголовка List :

Grid[{
  {Dynamic@a, Dynamic@b, Dynamic@c},
  Dynamic@If[show, Prepend[test, "test:"], {}]
  }, Frame -> All]

Отображение Dynamic над строкой тоже не работает, потому что show не обновляется динамически:

Grid[{
  {Dynamic@a, Dynamic@b, Dynamic@c},
  Dynamic /@ If[show, Prepend[test, "test:"], {}]
  }, Frame -> All]

Кроме того, обертывание Dynamic [If [...]] вокруг членов списка работает, но теперь у меня есть оценить If 3 раза вместо одного.

Grid[{
  {Dynamic@a, Dynamic@b, Dynamic@c},
  Dynamic[If[show, #, ""]] & /@ Prepend[test, "test:"]
  }, Frame -> All]

Хотел бы знать, есть ли какое-либо решение для преодоления этой конкретной проблемы путем локального применения динамической оболочки для строки.

7
задан István Zachar 5 June 2012 в 19:07
поделиться