JMP腳本語言最常見的用途是自動化工作流程。其次常見的用途是從JMP視窗中擷取結果。這很容易做到,但遺憾的是,對於新手來說,如何使用腳本來實現這一點並不直觀。我們將使用統一的顯示對像模型來解釋視窗的建構。然後,我們將介紹如何存取任何視窗中的任何內容。最後,我們將展示幾種替代的訪問方式。
本文將重點放在 XPath 查詢語言。除了嚴謹的背景知識外,我們還提供了在編寫 JMP 開發單元測試腳本時累積的實用範例。此外,我們還將重點介紹一些互動式 JMP 工具,這些工具能夠讓您更直接、更輕鬆地存取 JMP 內容,並分享一些最佳實踐。讓我們向您展示如何以最佳方式從 JMP 結果中獲取所需資訊!
大家好,我是 Mark Barley,我的同事 Tanya Muldon 也在這裡。我們今天的演講主題是「我能看到結果,但如何獲得結果?」。我們將探討一個常見問題。 JMP 會在不同的視窗中產生許多不同的結果,有時您可能需要自動化分析、自訂或修改顯示內容,甚至提取一些資訊用於進一步計算。這就引出了幾個問題:我該如何操作?是否有方法可以存取這些結果?是否有工具可以幫助我?最後,在編寫 JMP 腳本近四分之一世紀之後,是否有任何最佳實踐可以用於此目的?
在正式開始演示之前,我想先說明一點。您可以隨時讓 JMP 為您的平台儲存腳本。您對顯示所做的任何修改都會透過平台啟動腳本中的「傳送到顯示」參數自動記錄下來。將來當您想要重現該分析及其結果時,可以執行此腳本。
「傳送到顯示」參數是 JMP 用來記錄這些變更的一種機制,但它並非設計用於腳本編寫。我們將向您展示 JMP 中真正最佳實踐的技巧。
首先,您需要了解,在 JMP 中查看視窗時,實際上看到的是兩個協同工作的物件。第一個物件稱為分析層,它負責所有計算。您可以透過上下文選單與分析層進行互動。例如,點擊三角形即可進行選擇。另一個物件稱為報表層,它負責組織和顯示分析層的結果。
你想與報表層通信。我們透過物件引用來實現這一點,我們可以向該物件引用發送訊息。報表層具有分支樹狀結構,你最初使用的引用指向該顯示樹的根節點。每個分支上的節點都是 JMP 顯示框。現在的問題是,如何定位或識別要向其發送訊息的顯示框?我們使用下標來實現。下標位於原始報表層引用後面的方括號內。如果顯示框嵌套很深,則可能需要使用多個下標。這些下標可以是連續的,也可以是包含不同顯示框清單的單一下標。
下標可以採用多種形式,例如絕對下標、相對下標或條件下標。為了說明這一點,我將舉一個非常簡單的例子。這裡,我打開一個大型 REST 資料表。我向該數據表發送訊息 `variant`,以啟動體重與身高的分析。現在,我已經將該引用保存在變數物件中,可以向其發送訊息了。例如,我發送訊息 `fit line`,並將數字設為 1,以啟用該分析,您可以看到結果,即紅色的最小二乘擬合線。
但我想要選取顯示圖表的那個方塊。我需要透過報告訊息向分析層請求對該框的引用。我保存了引用。現在我可以為這個引用加上下標,在本例中,「frame box one」就是合適的下標。我們稍後會講到。然後我可以發送訊息“select”。這就是我們使用下標的基本方法。
我們先來談談絕對下標。在這種情況下,你使用一個索引來告訴你,在遍歷所有這些顯示框的分支結構時,你應該選擇哪個分支。假設我想選擇擬合概要中的某一列數字。我從根節點(即給定的引用)開始,然後沿著分支向下遍歷。從根節點出發,我依序向下遍歷第二個分支、第一個分支、第二個分支,依此類推。最後,我呼叫 select 方法。
您可以看到這種方法確實有效。絕對腳本雖然有效,但很難編寫,也很難閱讀。它們也非常不穩定。我的意思是,它們很容易失效,這取決於各種情況,例如您打開的程式、執行某些操作的順序,當然還有 JMP 本身的更新。我們不推薦使用絕對腳本。
相對形式更容易指定和閱讀。在這個範例中,為了找到同一列數字,我先輸入報告,然後下標如下所示:我想要大綱框編號 3、表格框編號 1、數字列框編號 1。讀到這裡,你幾乎可以想像出操作過程。結果是一樣的,但這種方式更穩定可靠。
第三種方法是使用 XPath 查詢語言。在這種情況下,我們將 XPath 訊息傳送到報表,它接受一個參數,即一個用於尋找所需內容的字串。與前兩種方法一樣,這種方法的結果也相同,但它更穩定可靠。此外,它功能最強大、最靈活。它會傳回所有符合項目的列表,而該查詢語言也支援許多函數和條件邏輯。
此投影片展示了該雙變數視窗的 XML 檔案開頭部分。 XML 是一種可擴展標記語言。我們不會深入講解其細節,但其核心思想是,它是一種表示 JMP 視窗的方式,而 XPath 查詢語言正是基於這種形式。
JMP 顯示樹以及 JMP 中的任何視窗都可以使用 XML 來表示。 XML 通常是一種用於標記和儲存層級資料及屬性的方法。 JMP 實現了該語言的第一個版本,我們另一個講義詳細介紹了該語言並提供其他線上資源。
我現在想先介紹一些基本的語法規則,讓大家有個概念,然後我會把麥克風交給 Tanya,讓她給大家展示一些我們如何使用它的實際例子。
XPath 也支援絕對路徑,即以一個斜線開頭,後面跟著要尋找的節點名稱。要顯示連續的節點,可以使用更多的斜線。但通常來說,這並非 JMP 顯示樹狀結構的最佳方式,因為 JMP 視窗是動態的。
更好的方法是使用相對路徑。在這種情況下,我們使用兩個斜線來標識第一個節點。該節點可以出現在顯示樹中的任何位置,之後可以新增其他節點,最終找到目標節點。這些節點不必相鄰,即不必是連續的分支。
第三行是一個簡單的例子。搜尋字串是尋找包含「大綱框」的相對路徑。這將傳回所有位於大綱框中的節點列表,因此功能非常強大。另一方面,您可以使用謂詞進行更精確的搜索,在本例中,謂詞指的是方括號內的內容。我稍後會詳細講解這些謂詞,但這裡我們可以進行限定,我們想要的不是所有大綱框,而只是包含標題、摘要或擬合的大綱框。
同樣,我們也有通配符,它允許我們指定搜尋的部分細節,而不是全部細節。例如,我想尋找標題包含“summary”一詞的任何大綱框。標題可以是“summary”,也可以是類似“summary of fit”這樣的標題。它會找到所有匹配項。我們也可以用它來匹配下一層的所有節點。 `Outlinebox/*` 將會傳回所有大綱框內的所有顯示框。
同樣,我們不僅可以搜尋節點,還可以搜尋屬性。在本例中,我們要尋找所有輪廓框的所有屬性。 @ 是屬性符號,星號表示任意屬性。
現在我們再詳細談談謂詞。謂詞用方括號括起來。在這個例子中,我們要尋找值為「summary of fit」的輪廓框。但我們還可以做更多。在第二行,您可以看到相同的搜索,只是在最後,我們不需要所有數字列框,只需要最後一個。您可以指定這類訊息,例如在第三行,我們要搜尋前三個輪廓框。我們使用了位置函數,並且它必須小於匹配的值。它不僅可以是關於節點的,還可以是關於該節點的屬性。我們可以找到所有寬度大於 10 的文字編輯框。您可以使用這種強大的功能。
在搜尋過程中,有時你需要取得某個顯示框的引用,或是發送訊息。但有時你只需要取得節點中的值或屬性。舉個例子,我們要找到所有存取框,以及每個存取框中的所有文字編輯框。我們不需要傳回顯示框的引用,而是需要取得該文字方塊中的值、目前文字等等。最後一行程式碼需要取得視窗中所有輪廓框的寬度。
最後,我想談談 XPath 的座標軸概念。座標軸的作用和我之前提到的分支類似,它指的是從一個節點跳到下一個節點,以及沿途找到的內容,包括向前、向後或向側查找。在第一個例子中,我要找到所有座標軸框,然後,這裡不用指定節點類型,而是用兩個句點來表示我想要這些座標軸框的父節點。
第二行也是一樣,我們要找標題為「平方和」的數字列框,然後找出它的父節點,也就是實際的數字列框。我可以明確地聲明它們之間的關係。在第三個例子中,我查看第一個圖片框,並尋找其子元素,該子元素的類型為文字編輯框。
我也可以反過來做。這和這張投影片上的第二個例子類似。我要查找一個類型為「T 比率」的數字列框標題,然後我想找到該顯示框的父級,類型也是數字列框。你擁有強大的功能和極大的靈活性。通常,一個簡單的搜尋字串就足夠了,但必要時,你可以使用謂詞和我提到的其他一些語法工具。
JMP提供了一些幫助功能。如果您開啟說明選單並蒐索腳本索引,您可以變更瀏覽器設定以顯示顯示框,在那裡您可以找到所有可用的顯示框及其關聯的協議,而且所有內容都可以搜尋。
此外,如果您右鍵單擊輪廓框前面的灰色三角形,會彈出一個選單,您可以從中選擇“顯示顯示樹”或“顯示屬性”。這些互動式工具可以幫助您瀏覽顯示樹,了解其中的值和屬性。這會非常有用。
此外,增強日誌是查看搜尋結果的絕佳方式,可以幫助您確定是否需要進行任何進一步的修改。 JSL 訊息中有一個名為「Get XML」的函數。有時您需要查看底層 XML 表示形式,這會很有幫助。另外,JSL 函數「Get Display Path」可以告訴您目標顯示框的正確下標形式或 XML 路徑形式。
我的講解就到這裡。現在我將把現場演示交給塔尼亞。
謝謝你,馬克。我想研究的第一個案例是使用 JSL 來獲取報告中顯示的值。首先,我需要確定哪個元素包含這些值。一種方法是透過“顯示屬性”功能。
「顯示屬性」告訴我,平均值包含在一個數字列框中。這個面板顯示了 Mark 之前提到的嵌套或分支樹狀結構。這個數字列框是表格框的一部分,表格框又是大綱框的一部分,以此類推。
您也會在這裡找到這個「路徑」框的輪廓節點。這裡是 JSL 程式碼,您可以用來取得名為「mean」的數字列框的參考。預設模式是下標方法。您也可以將其變更為 XPath,JMP 將顯示用於取得名為「mean」的數字列框引用的 XPath 程式碼。
確定資訊儲存在哪個元素後,接下來需要弄清楚可以向該元素發送哪些命令。一種方法是透過腳本索引。在尋找「數字列框」時,我們可以發現有多種 GET 訊息可以發送給它。這裡我將使用「GET 作為矩陣」這則訊息。
我將使用幾種不同的方法來獲取這些資訊。第一種方法是將資訊傳送到我的報表中。 RPT 是我的報表層,Mark 之前已經提過。在我的報表中,我將找到第一個數字列的文字框,並將這些值以矩陣的形式取得。我可以在下面的日誌中看到這些值。如果我查看我的報表,可以看到它們是相同的值。
接下來,我將使用 XPath 命令來獲取相同的資訊。這次,我將尋找標題為「測量變異性總和」的大綱框。我將查找標題為“平均值”的數字列框,並將其作為矩陣獲取。
最後,我將在這裡使用一些相對下標。在我的報告中,我將查找測量值的變異性匯總,以及名為「平均值」的數字列,並將其作為矩陣獲取。
雖然這三種方法都能得到相同的結果,但我們並不建議使用第一種方法。它不夠穩定。如果將來 JMP 修改報表,在我前面增加一個數字列,那麼執行這段程式碼就無法得到我預期的結果了。
最後這兩個例子都體現了相當穩健的改進。我最後展示的相對論範例比 XPath 範例短一些。通常情況下,當你只從報告中提取單個元素時,情況就是這樣。 XPath 的真正優勢在於一次性提取多個元素,或者當你使用通配符和謂詞進行一些複雜的操作時,例如 Mark 之前提到的那種情況。
讓我們來看一個更複雜的例子。在這個案例研究中,我們想要提取兩個回應的限值總和資訊。這裡有兩個回應,我們需要獲取它們各自的資訊。我們可以使用兩列的相對下標來實現這一點。
在報表層,我們可以在其下方顯示的第一個表格框中尋找重量限制匯總資訊。然後,我們可以使用第二個命令在第一個表格框中尋找重量限制匯總資訊並取得該資訊。
或者,我們可以使用單一 X 圖形命令。在報表圖層中,我們可以找到名為「控制圖產生器」的輪廓框。您可以在這裡看到它。我們可以尋找「控製圖產生器」下顯示的所有表格框,並取得相關資訊。
編寫這段程式碼後,我們在日誌中看到了比預期多得多的資訊。您在這裡看到的是報告中顯示的表格框,以及一些不可見的表格框。報告中還有其他表格框,例如新增的限製或 Sigma 報告,但我們尚未將這些資訊新增至報告層。我們可以在 XPath 語句中加入一些訊息,使其可見。
對於所有這些表格框,我們不僅要查看表格框本身,還要查看它的父級表格框,並判斷它們是否可見。在這段程式碼中,我們檢查的是可見性是否為 false,但這裡還有一個 not 語句。實際上,我真正想要的是報表中可見的表格框。運行這段程式碼後,我發現它得到了與之前使用兩個語句相同的資訊。 XPath 讓我能夠透過一條語句而不是兩個語句來獲取這些資訊。
在接下來的案例研究中,我將建立一個預測分析器,並最大化期望值。我想取得報告中紅色的 Y 值和紅色的 X 值。由於它們都是座標軸值,而且都是紅色,您可能會認為它們儲存在同一個元素中。然而,事實並非如此。
我們可以返回“顯示屬性”視窗查看這一點。如果我點擊對了,可以看到 Y 值實際上是文字框,X 值是數字編輯框。首先,我們來處理這些文字方塊。我們將透過 XPath 查找預測分析器,然後查找可見的文字方塊。同樣,我們需要添加一些程式碼來設定可見性,因為報告中有一些文字方塊不可見,我們不想取得這些文字方塊。
運行這段程式碼後,我們發現不僅得到了紅色數值,還得到了置信區間的藍色數值,這是因為它們也以文字方塊的形式儲存了。我們可以新增一個 for 迴圈來遍歷每個元素,只提取每隔三個紅色數值中的一個,並將這些資訊儲存在一個矩陣中。
現在我們有了之前用紅色顯示的 Y 值,但我們還需要之前用紅色顯示的 X 值。這些值儲存在數位編輯框中。我們可以使用 XPath 語句在這些數字編輯框中尋找預測分析器,並將這些值以矩陣的形式取得。這些值記錄在下面的日誌中。
在接下來的案例研究中,我想取得第一個框架框或位置圖中每條線的 Y 值,也就是平均直徑。查看「顯示屬性」後,你會發現無法真正進入這個框架框圖層。點擊這裡會顯示一個框架框,但我看不到框架框內的內容。我需要知道這些值是如何儲存在框架框中的。獲取此資訊的另一種方法是使用“顯示樹狀結構”。
在「顯示樹狀結構」中,我還可以看到 Mark 之前提到的分支結構。在這個框架框內,我看到有各種各樣的線段。我感興趣的是出現在下面的這些線段。我可以使用 XPath 語句從第一個框架框中取得所有線段。
之前我的所有 XPath 語句都有一個輪廓框節點,但這個沒有。在控製圖產生器中,它並非必需。即使有多個響應,控製圖產生器中的所有圖表都會顯示在此輪廓框下方。因此,我並不需要它,它並非必要。
運行這段程式碼後,可以看到有七個元素。我可以選擇使用關聯數組來取得這些元素對應的 Y 值。運行後,我看到平均值對應的 Y 值為 4.2,下限對應的 Y 值為 4.1,依此類推。
在接下來的案例研究中,我有三個不同的圖表。我希望每個圖表的 Y 軸具有相同的最小值和最大值,並為每個圖表添加相同的參考線。首先,我需要取得座標軸框的句柄。我將使用 XPath 尋找“擬合群組輪廓”節點。然後,我將查找所有可見的座標軸框。
我看到有六個不同的座標軸框。有三個圖表,每個圖表都有一個 X 軸和一個 Y 軸,所以總共六個。我將使用 for 迴圈來遍歷每個座標軸的值。對於 Y 軸,我將設定最小值和最大值,並新增一條參考線。現在,對於我的三個圖表,我都添加了參考線,並將最小值和最大值設為相同的值。
接下來,我想縮短這份「西格瑪能力匯總報告」的顯示範圍。我只想看到截至 PP 的部分,不想看到 CPM、預期值或觀測值。我可以透過 XPath 來實現。我將向報告圖層發送一個大綱框命令,查找「西格瑪能力匯總報告」。
在取得到報告的相應層級後,我想使用 XPath 選擇以「預期」、「觀察」或「等於 CPM」開頭的標題框。選擇完成後,我將發送折疊顯示命令。現在我發現這些值已從報告中消失。切勿從報告中刪除項目。刪除項目可能會導致意想不到的後果。我們建議您折疊或隱藏報告中的內容,而不是刪除項目。
我還有最後一個例子。在這個案例研究中,我們將「管理限額」平台放在了一個新視窗中,並且我們希望移除這個幫助按鈕。建立 JSL 腳本時,您通常會這樣做,因為您想與他人分享結果。因此,您需要確保腳本在您的電腦上的運作情況與在其他人的電腦上的運作情況相同。
Windows 和 Macintosh 系統中按鈕的位置通常不同。你不應該根據按鈕在報表中的位置來查找它,而應該根據按鈕的名稱而不是位置來查找。這裡我不會深入講解視窗處理程式程式碼,但我想讓你注意的是這條 XPath 語句。我正在尋找名為“幫助”的按鈕框,然後將其隱藏。你會看到「幫助」按鈕不再顯示在這裡了。我剛才又點擊了一下。我不想把它從報表中刪除,因為我不想造成意想不到的後果。
我已經向您展示了三種從報表中獲取值的方法。絕對下標並非理想之選,它對資料變化不夠穩健。 XPath 方法和相對下標則相當可靠。如果您只是從報表中取得單一值,相對下標的程式碼可能會更簡潔。 XPath 代碼適用於一次性獲取多個信息,以及需要使用通配符等複雜操作的情況。
希望這些資訊對你有幫助,讓你能夠回去繼續寫劇本。