列錶框() 中的表格框() 的腳本幫助大家好,
我正在嘗試編寫一些 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)));