Ist*_*har 7 wolfram-mathematica dynamic wrapper
我想以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}]
Run Code Online (Sandbox Code Playgroud)

虽然出于某些原因我想要在本地指定Dynamic,但仅适用于第二行Grid.
对于那些想知道什么是不道德的情况的人来说,想象一下:show在任何一个中使用a,b或者c,这些我不想在show更改时更新,它们的更改取决于其他触发器.为什么不show从第一行的符号中删除呢?想象一下,我不能,因为show在一个函数中使用a,b或者c,这个函数我无法轻易访问.
当然包装Ifinto 的第一个参数在Dynamic这里没有用,因为它Grid本身或它的任何单元格都不会变得动态:
Grid[{
{Dynamic@a, Dynamic@b, Dynamic@c},
If[Dynamic@show, Prepend[test, "test:"], {}]
}, Frame -> All]
Run Code Online (Sandbox Code Playgroud)
此外,将行包装成Dynamic使得给定行无效,因为它不再具有头部List:
Grid[{
{Dynamic@a, Dynamic@b, Dynamic@c},
Dynamic@If[show, Prepend[test, "test:"], {}]
}, Frame -> All]
Run Code Online (Sandbox Code Playgroud)
Dynamic对该行的映射不起作用,因为show未动态更新:
Grid[{
{Dynamic@a, Dynamic@b, Dynamic@c},
Dynamic /@ If[show, Prepend[test, "test:"], {}]
}, Frame -> All]
Run Code Online (Sandbox Code Playgroud)
此外,Dynamic[If[...]]围绕列表成员工作,但现在我必须评估If3次而不是1次.
Grid[{
{Dynamic@a, Dynamic@b, Dynamic@c},
Dynamic[If[show, #, ""]] & /@ Prepend[test, "test:"]
}, Frame -> All]
Run Code Online (Sandbox Code Playgroud)
想知道是否有任何解决方案可以通过Dynamic在行上局部应用包装来克服这个特定问题.
这是使用实验的解决方案ValueFunction
show = True;
test = {0, 0};
Checkbox[Dynamic[show]]
Run Code Online (Sandbox Code Playgroud)
现在在旁边编写您自己的动态更新小函数
Needs["Experimental`"];
row = {};
updateRow[x_, v_] := row = If[v, Prepend[test, "test:"], {}];
ValueFunction[show] = updateRow;
Run Code Online (Sandbox Code Playgroud)
现在创建网格,现在可以在每一行上使用动态,而不是在整个网格周围使用动态,这就是您想要的:
Grid[{
{Dynamic@a, Dynamic@b, Dynamic@c},
{Dynamic@row}
},
Frame -> All
]
Run Code Online (Sandbox Code Playgroud)

附:我刚刚读了 telefunkenvf14 的一篇文章,提到了这个包和这个函数,我不知道,当我看到这个函数时,我想起了这个问题,我想应该可以使用这个函数来解决这个问题。
附:我需要更多努力正确放置网格行......
更新(1)
我不知道如何将最后一行拼接到网格中的列上。这很奇怪,因为它有列表头,但它不会遍历所有列。它只会进入第一个单元格。尝试过 Sequence、SpanFromLeft 等,但没有成功。也许有人可以弄清楚这部分。
这是我目前的试用:
Needs["Experimental`"];
row = {};
updateRow[x_, v_] := row = If[v, {"test:", 0, 0}, {}];
ValueFunction[show] = updateRow;
show = False;
Checkbox[Dynamic[show]]
f = Grid[{
{Dynamic@a, Dynamic@b, Dynamic@c},
List@Dynamic[row]
},
Frame -> All
]
Run Code Online (Sandbox Code Playgroud)
看来应该是可行的。我现在不明白问题是什么......
更新(2)
作为临时解决方案,我事先强行分割了第二行。这使得我可以做我想做的事。不确定这是否符合 OP 规范(我的猜测是不符合),但它是:
Needs["Experimental`"];
ra = 0;
rb = 0;
rc = 0;
updateRow[x_, v_] :=
row = If[v, ra = "test:"; rb = 0; rc = 0, ra = ""; rb = ""; rc = ""]
ValueFunction[show] = updateRow;
show = False;
Checkbox[Dynamic[show]]
f = Grid[{
{Dynamic@a, Dynamic@b, Dynamic@c},
{Dynamic@ra, Dynamic@rb, Dynamic@rc}
},
Frame -> All]
Run Code Online (Sandbox Code Playgroud)
