列表框() 中的表格框() 的脚本帮助大家好,
我正在尝试编写一些 JSL 代码,从数据表中获取数据并以图形方式显示它,以供用户选择以进行进一步分析。 我想要得到的是来自 PCA 平台的特征值报告和来自拟合模型平台的效果摘要报告之间的混合。 我希望视觉效果看起来像 PCA 报告,但具有效果摘要报告的功能(即能够选择一行)。
PCA 特征值报告(我想要的样子):

拟合模型效果摘要报告(我想要的功能)。 在此平台中,可以在列表框()中选择一行并选择“删除”或“添加”。 我不想删除或添加,但我确实希望用户能够选择该行(从上面的输出中):

我已附上我正在使用的数据表,这是下面 JSL 代码中的“当前数据表()”。 下面的 JSL 代码可以帮助我完成部分任务,但并不完全是我想要的。
Names Default To Here( 1 );
PC_dt = Current Data Table();
PC_n = {};
PC_eigv = {};
PC_per = {};
PC_cump = {};
For( i = 1, i <= N Rows( PC_dt ), i++,
Insert Into( PC_n, PC_dt:"Number"n[i] );
Insert Into( PC_eigv, Round( PC_dt:"Eigenvalue"n[i], 5 ) );
Insert Into( PC_per, Round( PC_dt:"Percent"n[i], 5 ) );
Insert Into( PC_cump, Round( PC_dt:"cumulative Percent"n[i], 5 ) );
);
PC_Rpt_win = New Window( "PC Results",
Outline Box( "Eigenvalues & cumulative Percent",
//List Box(
//List Box(
Table Box(
Number Col Box( "Number", Eval List( PC_n ) ),
Number Col Box( "Eigenvalue", Eval List( PC_eigv ), <<SET format=""></SET>
通过注释掉的部分,我从代码中得到以下输出(但是没有行可供选择):

我真的不知道我是否需要代码的整个预大纲框部分,在其中生成 PC 和特征值等的列表。但是,这似乎是执行此操作的逻辑方法,因为我正在处理中的列数据表和函数需要列表。 即使没有必要,它也能发挥作用。
</CODE></P><P> </P><P>如果我在 Table Box() 周围包含一个或两个注释掉的 List Box() 调用,我会得到以下结果。 行可以选择,但没有显示任何内容:</P><P><SPAN class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="DiedrichSchmidt_3-1635336043749.png" style="width: 400px;"><SPAN class="lia-inline-image-display-wrapper" image-alt="DiedrichSchmidt_3-1635336043749.png" style="width: 221px;"><span class="lia-inline-image-display-wrapper" image-alt="DiedrichSchmidt_3-1635336043749.png" style="width: 221px;"><img src="https://us.v-cdn.net/6038925/uploads/images/37045iA319787974999980/DiedrichSchmidt_3-1635336043749.png" role="button" title="DiedrichSchmidt_3-1635336043749.png" alt="DiedrichSchmidt_3-1635336043749.png" /></span></SPAN></SPAN></P><P>我不确定我做错了什么,脚本索引关于如何正确使用 List Box() 调用和 Table Box() 的示例有限。 我尝试遵循“拟合模型”平台报告窗口中的树结构,但它不起作用。</P><P> </P><P>总之,我想在我的脚本中更正以下内容:</P><OL><LI>更正绘图列框,使其具有像 PC 报告所示的累积百分比曲线(上面的第一张图片)。 这并不像第 2 项那么重要。</LI><LI>更正 Table Box() 周围的 List Box() 调用,以便用户可以在列表框中选择一行,然后将其发送到另一个函数以进行进一步分析。</LI></OL><P>感谢您的任何建议和帮助!,</P><P>DS</P></LINGO-BODY><LINGO-LABS id="lingo-labs-430708" slang="en-US" mode="NONE"><LINGO-LABEL>自动化和脚本编写</LINGO-LABEL><LINGO-LABEL>大规模定制</LINGO-LABEL></LINGO-LABS><LINGO-SUB id="lingo-sub-431611" slang="en-US" mode="NONE">回复:列表框()内的表格框()的脚本帮助</LINGO-SUB><LINGO-BODY id="lingo-body-431611" slang="en-US" mode="NONE"><P>以下是从报告中的表中获取数据以及从 PLS 报告中获取 T2 的另一种方法:</P>
<P> </P>
<PRE><CODE class=" language-jsl">Names default to here(1);
dt = Open("$Sample_data/Quality Control/Chemical Reactor Process.jmp");
pls = dt << Run Script("Fit PLS (Pro Only)");
//get values for the first column with the name R²Y by searching for display elements that have a
//child header box containing specific values
(pls << XPath("//NumberColBox[NumberColBoxHeader[text()='R²Y']]"))[1] << get as matrix;
//generalize this into a function and then call it for others column headers
getColumn = function({c},(pls << XPath("//NumberColBox[NumberColBoxHeader[text()='" || c || "']]"))[1] << get as matrix);
getColumn("Q²");
getColumn("Y Responses");
//To get T2, you need to send the message to a specific fit within the platform. As Mark mentioned this is tricky because you
//need to send the message to the analysis layer (I've been calling it a scriptable object), but to find the right object you
//navigate the report structure. I like Xpath, so here is how I would get the report (implied with the XPath function),
//navigate to the outline box (picks the first one matching a name), get the scriptable object or analysis layer and then
//send the message to save T2.
firstfit = (((pls << XPath("//OutlineBox[contains(text(),'NIPALS Fit with ')]"))[1]) << Get Scriptable Object) << Save T Square();
firstfit << Save T Square;
//This might better illustrate what is happening
show properties( report(pls)[Outline Box( "Partial Least Squares" )][Outline Box( "NIPALS Fit with 6 Factors Using Fast SVD" )] << get scriptable object );
回复:列表框()内的表格框()的脚本帮助这个问题源于一个常见的混乱点。 JMP平台由分析层和报告层组成。 分析层负责计算并响应红色小三角菜单中显示的命令。 报表层负责信息的呈现。 报表层是显示框的嵌套结构。 您需要将 Save T Square 消息发送到分析层,而不是报表层。 对分析层的引用是您启动平台时返回的引用。 例如,
biv = Current Data Table() << Bivariate( Y( :weight ), X( :height ), Fit Line );
变量 biv 存储对平台的引用,或更具体地说是对分析层的引用。 然后,您可以通过另一条消息获取对关联报表图层的引用。
bivRep = biv << Report;
希望这个解释能够澄清您的问题。
回复:列表框()内的表格框()的脚本帮助你好@jthi ,
再次感谢您的快速反馈和帮助。 是的,<
现在,我唯一的问题是如何保存T²。 每次我尝试从 PCA 平台处理有问题的轮廓框时,都会收到一条日志错误,指出显示框无法识别 <
谢谢!,
DS
回复:列表框()内的表格框()的脚本帮助对于第 1 项:
我猜想还有其他/更好的方法可以做到这一点,但我发现 << Lower 和 << Upper (需要指定 Lower)消息。 使用 << Lower,您可以从累积列中获取第一个值,然后将这些值设置为使用 Lower 绘制 Col Box
pcb << Lower(ncb << get as matrix);

使用您的代码,它看起来像这样(添加引用并使用它们):
查看更多... 为了获取值:
有时使用 Make into 数据表可能就足够了(取决于平台以及是否使用 By 变量):

然后从结果表中检查表脚本:


有时,这提供了相当快速的方法来获取正确显示框的参考。
回复:列表框()内的表格框()的脚本帮助你好@jthi ,
好吧,忘记有关 DModX 的部分,脚本索引向我展示了如何做到这一点,并且它按预期工作。 它有一个 Save T Square 的示例,但不起作用。 我会坚持下去。 我想我需要引用正确的大纲框。
谢谢!,
DS
回复:列表框()内的表格框()的脚本帮助你好@jthi ,
感谢您的快速反馈。 我之前曾尝试过,但什么也没发生,所以我放弃了它,选择了另一条路线,但它没有通向任何地方。 我回去试了一下,确实有效,谢谢! 添加的功能很有帮助。 这绝对解决了第 2 项,也是更重要的一项。 如果有任何想法如何修复第 1 项,那就太好了,但不是必需的。
这是相关的,但也许是另一个线程(让我知道,我会将其重新发布为另一个线程)。
您知道如何使用JSL将PCA平台中的DModX和T²值保存到数据表中吗? 所有这些都是为了尝试自动化此过程,或者至少删除其他几个步骤,并为用户提供决定用于保存 DModX 和 T² 公式的 PC 数量的基础知识。
谢谢!,
DS
回复:列表框()内的表格框()的脚本帮助List Box() 是否有特定需求? 您可以使用<< 设置可选行();使行在表格框中可选择,然后使用<< 设置行更改函数(Function({this}, );向选择添加功能。
脚本索引示例:
Names Default To Here(1);
New Window("Mountains",
tb = Table Box(
String Col Box("Mountain", {"K2", "Delphi", "Kilimanjaro", "Grand Teton"}),
Number Col Box("Elevation (meters)", {8611, 681, 5895, 4199}),
Plot Col Box("", {8611, 681, 5895, 4199})
)
);
tb << Set Selectable Rows();
tb << set row change function(Function({this}, Print(this << get selected rows)));