如何将图形选择与 JSL 链接?大家好!
我正在使用应用程序生成器,并且我使用图形生成器编写了几个不同的图。 许多图表使用不同的数据表,这些数据表已使用 Python 进行操作并发送回 JMP。 由于数据在 Python 中经过大量处理,因此这些表不包含任何相同的变量。我正在寻找一种使用 JSL 连接这些图表上的选择的方法(例如,如果您选择其中一个图例标签,并且它会使未选择的项目变灰)。
例如,我正在绘制原始数据和“最终产品”数据的图表,这些数据大大减少了维度,并且相似的特征被分组在一起,因此在 Table1/Graph1 中可能有 30 列,而在 Table2/Graph2 中只有 3 列。 如果我有一个包含 Table2 变量的列表框,并且选择 Variable1,我希望能够突出显示 Graph2 上的 Variable1,同时突出显示 Graph1 中的相关信息。 我可以确定要突出显示的相关列/行,但我无法找到如何在图表上实际设置这些选择。 如果我可以选择图表上的图例标签之一(它会自动使未选择的项目变灰)并编写一些脚本以便它选择其他图表上的相关信息,那就太好了。
是否有一条 JSL 线可以在这样的图表上突出显示某些内容?
大规模定制回复:如何将图形选择与 JSL 链接?行状态处理程序在所有行状态更改时触发。 因此,当您选择 1 行时,您会触发(至少)两个事件;一项取消选择,一项选择。 这很可能会导致一些问题,并且很容易导致循环。 如果您只能捕获特定事件(选择、取消选择、隐藏、排除...),也许它会起作用。
回复:如何将图形选择与 JSL 链接?我懂了... 谢谢(你的)信息! 由于我要结束有关行状态处理程序的本章,哈哈,我决定再次尝试上面提供的“<< 添加图形脚本”想法,但这次带有标志。 当没有标志的情况下实现时,它似乎表现出与我上面处理的相同(坏)行为,但是和标志它似乎有效!
appNS:already_run=0;
Eval(EvalExpr(Report(gb1)[FrameBox(1)] << Add Graphics Script(
If(appNS:already_run==1,
appNS:already_run=0,
f = dt1 << Get Selected Rows;
group_selected = dt1[f, "index1"];
appNS:already_run=1;
expr(dt2) << Select Where(Contains(group_selected, :"index2"));
))));
Eval(EvalExpr(Report(gb2)[FrameBox(1)] << Add Graphics Script(
If(appNS:already_run==1,
appNS:already_run=0,
f = dt2 << Get Selected Rows;
group_selected = dt2[f, "index2"];
appNS:already_run=1;
expr(dt1) << Select Where(Contains(group_selected, :"index1"));
))));
希望随着我扩展图形连接,这将继续发挥作用。 知道为什么行状态处理程序会不断地一遍又一遍地获取“选择”(从而在图形之间创建循环并冻结 JMP)以及为什么图形脚本中的相同 JSL 不会?
我真的很感谢你的帮助@jthi & @tx尼尔森!
回复:如何将图形选择与 JSL 链接?在某些时候,可以在增强日志中生成“有用”消息

回复:如何将图形选择与 JSL 链接?行状态处理程序会发生一些不太有趣的事情(我总是试图避免它们,因为在我看来它们的工作效果还不错)。 尝试通过单击 Big Class 中的单行来运行我提供的示例,并查看 JMP 日志。
Names Default To Here(1);
dt1 = Open("$SAMPLE_DATA/Big Class.jmp");
dt2 = dt1 << Summary(
Group(:sex),
Mean(:height),
Mean(:weight),
Freq("None"),
Weight("None"),
Link to original data table(0)
);
Eval(Eval Expr(f1 = Function({a},
rows = Loc(Expr(dt1) << Get Row States, 1);
group_selected = Expr(dt1)[rows, "sex"];
show(Expr(dt1) << Get Row States, a);
Expr(dt2) << Select Where(Contains(group_selected, :sex), current selection("clear"));
wait(1);
)));
rs1 = dt1 << Make Row State Handler(f1);
Eval(Eval Expr(f2 = Function({a},
rows = Loc(Expr(dt2) << Get Row States, 1);
show(Expr(dt2) << Get Row States, a);
group_selected = Expr(dt2)[rows, "sex"];
// Expr(dt1) << Select Where(Contains(group_selected, :sex));
)));
rs2 = dt2 << Make Row State Handler(f2);
dt1 << On Close(
rs1 = .;
rs2 = .;
close(dt2, no save);
);<BR />Clear Log();
回复:如何将图形选择与 JSL 链接?这就是我一直在尝试的,但我认为我对状态/行状态处理程序/标志的理解不够好。 我附上了上述内容的视频。 所示图表与 f2 和 dt2 相关:
appNS:already_run=0;
Eval(EvalExpr(f1 = Function({a},
Show(appNS:already_run);<BR /> If(appNS:already_run==1,
appNS:already_run=0,
rows = dt1 << Get Selected Rows;
appNS:already_run=1;
group_selected = dt1[rows, "index1"];
expr(dt2) << Select Where(Contains(group_selected, :"index2"));
))));
rs1 = dt1 << Make Row State Handler(f1);<BR /><BR />Eval(EvalExpr(f2 = Function({a},<BR /> Show(appNS:already_run);
If(appNS:already_run==1,
appNS:already_run=0,
rows = dt2 << Get Selected Rows;
appNS:already_run=1;
group_selected = dt2[rows, "index2"];<BR /> Show(group_selected);
expr(dt1) << Select Where(Contains(group_selected, :"index1"));
))));
rs2 = dt2 << Make Row State Handler(f2);起初我认为拖动会导致问题,因为选择随着添加的每个新点而变化,直到拖动完成,但根据日志中的“group_selected”输出,甚至看起来选择都没有改变。 在我看来,循环是因为在行状态处理程序中添加了新的选择,但我不确定如何避免这种情况以实现两个图(以及最终更多)相互指向的目标。
欢迎任何建议。
回复:如何将图形选择与 JSL 链接?我将使用 Show() 语句在日志中显示标志状态,然后进行拖动,看看是否可以确定计时问题出在哪里。
回复:如何将图形选择与 JSL 链接?非常感谢您的回复, @tx尼尔森! 使用标志是个好主意。 不幸的是,我仍然遇到一些递归问题...... 我已经搞乱了标志变量的不同位置,并且由于我对正在使用的 JSL 的理解有限,当前的语法对我来说最有意义(几乎完全符合伪代码的结构)。这是我的:
appNS:already_run=0;
Eval(EvalExpr(f1 = Function({a},
If(appNS:already_run==1,
appNS:already_run=0,
rows = dt1 << Get Selected Rows;
appNS:already_run=1;
group_selected = dt1[rows, "index1"];
expr(dt2) << Select Where(Contains(group_selected, :"index2"));
))));
rs1 = dt1 << Make Row State Handler(f1);<BR /><BR />Eval(EvalExpr(f2 = Function({a},
If(appNS:already_run==1,
appNS:already_run=0,
rows = dt2 << Get Selected Rows;
appNS:already_run=1;
group_selected = dt2[rows, "index2"];
expr(dt1) << Select Where(Contains(group_selected, :"index1"));
))));
rs2 = dt2 << Make Row State Handler(f2);<BR />如果我通过单击图例标签进行选择(耶!),并且如果我通过单击绘图上的各个标记进行单一选择(耶!),则上述内容确实有效,但如果我尝试通过拖动选择窗格进行选择,则进入循环在实际情节上(这是我的用户最有可能的情况)。我的标志变量对于每个单独的函数应该是不同的吗? 目前我可以让它按照我所描述的那样工作的唯一方法是使用相同的标志变量...... 难道只是我忽略了一些东西吗?
如果我什至将鼠标悬停在图表上而不单击任何内容,它似乎也会以某种方式改变我的“already_run”标志变量。 这是由于行状态处理程序的工作方式造成的吗?
我感谢您的帮助!
回复:如何将图形选择与 JSL 链接?当其中一张图表选择了点、线等时,从同一数据表生成的所有图表将自动选择其点、线等。
如果图表来自 2 个不同的表,则可以为每个数据表构建行状态处理程序。您关于循环论证的陈述是正确的,但是,我的处理方式是在每个处理程序中设置一个标志,以防止循环的继续。
这是一段简单的伪代码,应该可以让您了解如何设置它
// Pseudo code, not runnable
dt1 = data table( "one" );
dt2 = data table( "twO" );
f1 = Function( {a},
if(flag ==1,
flag = 0,
theRows = dt1 << get selected rows;
flag = 1;
dt2 << select rows(theRows);
);
rs = dt1 << make row state handler( f1 );
f2 = Function( {a},
if(flag ==1,
flag = 0,
theRows = dt2 << get selected rows;
flag = 1;
dt1 << select rows(theRows);
);
rs = dt2 << make row state handler( f2 );回复:如何将图形选择与 JSL 链接?有没有一种方法可以使用行状态处理程序,使 Graph1 上的选择突出显示 Graph2 上的相关信息和反之亦然? 我可以以一种方式或另一种方式得到它,但似乎如果我想两者都做,它就会变成一些冻结 JMP 的循环论证......有没有一种聪明的方法可以将两个图形/数据表指向另一个,而不会导致循环论证?
回复:如何将图形选择与 JSL 链接?当在图形生成器、双变量等图形中选择点或线时,将在关联的数据表中选择与选择关联的行。这与表是否可见无关。因此,实现行状态处理程序是一件相当简单的事情,只要检测到行选择的更改,该处理程序就会运行。
回复:如何将图形选择与 JSL 链接?感谢您的回复, @jthi ! 我不确定这些解决方案是否适用于我的情况,除非有一种方法可以简单地根据图表上的选择来确定所选的行/列/索引/等。 我的应用程序中使用的数据表对于用户进行选择都不可见...... 这个想法只是与可视化交互,代码在幕后对表格进行所有操作。
我觉得对于图形选择必须有一些“<< Get Selected”的迭代,但我还没有在脚本索引中找到正确的实现。 如果有一条 JSL 行,那么我认为一旦做出选择,您提到的“<< 添加图形脚本”想法就可以很好地工作!
回复:如何将图形选择与 JSL 链接?我从未使用过应用程序生成器,但您可能会使用行状态处理程序。
Names Default To Here(1);
dt = Open("$SAMPLE_DATA/Big Class.jmp");
dt_summary = dt << Summary(
Group(:sex),
Mean(:height),
Mean(:weight),
Freq("None"),
Weight("None"),
Link to original data table(0)
);
Eval(EvalExpr(f_summary = Function({a},
f = dt_summary << Get Selected Rows;
group_selected = dt_summary[f, "sex"];
expr(dt) << Select Where(Contains(group_selected, :sex));
)));
rs_summary = dt_summary << make row state handler(f_summary);
nw = New Window("demo",
gb1 = dt << Graph Builder(
Size(529, 457),
Show Control Panel(0),
Variables(X(:weight), Y(:height), Color(:sex)),
Elements(Points(X, Y, Legend(4)))
),
gb2 = dt_summary << Graph Builder(
Size(535, 451),
Show Control Panel(0),
Variables(X(:sex), Y(:"Mean(height)"n), Y(:"Mean(weight)"n, Position(1))),
Elements(Bar(X, Y(1), Y(2), Legend(4), Label("Label by Value")))
);
);
nw << On Close(rs_summary = .);
其他选项可能是使用图形脚本:
Names Default To Here(1);
dt = Open("$SAMPLE_DATA/Big Class.jmp");
dt_summary = dt << Summary(
Group(:sex),
Mean(:height),
Mean(:weight),
Freq("None"),
Weight("None"),
Link to original data table(0)
);
nw = New Window("demo",
gb1 = dt << Graph Builder(
Size(529, 457),
Show Control Panel(0),
Variables(X(:weight), Y(:height), Color(:sex)),
Elements(Points(X, Y, Legend(4)))
),
gb2 = dt_summary << Graph Builder(
Size(535, 451),
Show Control Panel(0),
Variables(X(:sex), Y(:"Mean(height)"n), Y(:"Mean(weight)"n, Position(1))),
Elements(Bar(X, Y(1), Y(2), Legend(4), Label("Label by Value")))
);
);
Eval(EvalExpr(Report(gb2)[FrameBox(1)] << Add Graphics Script(
f = dt_summary << Get Selected Rows;
group_selected = dt_summary[f, "sex"];
expr(dt) << Select Where(Contains(group_selected, :sex));
)));
另一种选择是使用虚拟联接,但这需要您将数据表保存在某处。