揚聲器 | 成績單 |
| 溫蒂·墨菲 | 您好,感謝您今天參加我們的演講。我們很高興與您討論不同經驗水平的腳本作者遇到的常見場景。 |
| 我們的目的是解釋正在發生的事情,以便您擁有避免這些錯誤的工具和知識。那麼就讓我們開始吧。 |
| 也許因為預設情況下它沒有打開,所以很容易忘記檢查日誌中的消息。但日誌包含有關最近腳本執行的有用資訊。那麼讓我們在 JMP 中仔細看看這個範例。 |
| 在這裡我們可以看到該腳本只是打開一個資料表並嘗試進行行選擇。當我們運行這個腳本時, |
| 我們收到致命錯誤的互動式錯誤訊息,即腳本因錯誤而停止的情況。彈出視窗是 JMP 15 的新行為,可以在首選項中將其關閉。 |
| 當我們忽略該訊息時,我們可以檢查日誌,我們從視窗中看到相同的訊息,但我們也看到行號 |
| 找到腳本文件的名稱,以幫助引導我們找到問題區域。現在,不要只依賴這些彈出窗口,因為其他重要訊息也會出現在日誌中, |
| 並且它們不一定會導致彈出視窗。那麼讓我們來看另一個例子。 |
| 在此腳本中,作者嘗試開啟一個表格、建立分析並將訊息列印到日誌中。 |
| 當我們運行這個腳本時,我們立即註意到我們的分析沒有產生。 |
| 所以我們再次檢查日誌 |
| 我們看到資料表中沒有找到一列,但腳本繼續並將我們的訊息列印到日誌中。 |
| 因此,這裡重要的一點是始終檢查日誌,尤其是當發生的情況不符合您的期望時。它可能就像拼寫錯誤的列名一樣簡單。 |
| 當前資料表的概念通常被描述為活動表。但是是什麼使該表成為活動或當前資料表以及為什麼它對您的腳本很重要? |
| 當開啟、建立或以其他方式操作表時,它就成為目前資料表。但是,還有其他方式可以使表在運行時變為當前狀態,而腳本作者可能沒有預料到。 |
| JMP 在背景處理它們的任務。例如,JMP 可能需要計算公式或更新視窗。 |
| 這些後台進程可能會導致產生與您打算在運行時啟動的表不同的表。這可能會導致您的腳本失敗,或者更糟的是,您甚至沒有意識到 JMP 使用了錯誤的表。 |
| 所以在這裡我們提供了一些 |
| 使用特定於資料表的引用來製作腳本的最佳實踐。透過這種方式,您可以確保使用正確的表,無論運行時哪個表處於活動狀態。 |
| 在此範例中,我們將示範如何向特定資料表發送二元調用,以確保該表中的資料用於您的分析。 |
| 您也可以使用新列作為傳送到特定資料表的訊息,這將確保您的新列在所需的表中創建,並且不會轉到目前的表。 |
| 您也可以使用可選的資料表引用。在這裡,我們只是演示如何使用它來引用列,我們將更詳細地討論引用列。 |
| 您也可以在函數中使用可選的資料表引用;對於每行和匯總,如果可用,則有兩個。 |
| 我們也建議您避免使用資料表...在生產腳本中使用目前資料表函數指派資料表參考。在此範例中,我們連接兩個資料表,並且希望指派對該表的引用 |
| 這是從連接創建的。現在,join 傳回對新建立的表的參考。因此,我們不想分配給當前資料表,而是在建立聯接時分配參考。 |
| 所以在這裡,我們只需在呼叫 join 時進行分配,並在運行時進行分配 |
| 我們可以看到,我們的新 DT 變數確實引用了所需的表,而且它不受當前表的影響。 |
| 能夠使用 JSL 變數識別列是一項常見任務,您使用哪種方法取決於您的預期用途。 |
| 列函數傳回作為整個單元的列的參考。它接受多種參數,例如列名是字串或字串變量, |
| 索引或表示索引的數值變數。可以為其新增下標以引用特定行上的列值。 |
| 您可以使用列函數的一些地方包括平台呼叫、向列發送訊息或向列指派變數參考。 |
| as 列函數傳回目前行上的值的引用 |
| 指定列的。它接受與列函數相同的所有參數,但重要的是要了解,在 JMP 中,除非另有管理,否則當前行始終為零。 |
| 因此,使用 as 列函數的一些好地方是在公式中,對於每一行,並選擇其中,因為它們透過設計對每一行進行評估時控制行。讓我們來看一個例子來說明我們的意思。 |
| 在這裡,我們打開一個範例資料表。我們已將 JSL 變數指派給列的名稱,並且嘗試在 select where 中使用列函數。 |
| 現在,當我們運行此腳本時,我們發現沒有選擇任何行。這是為什麼?因為選擇每行的計算位置, |
| 使用不帶任何下標的列函數將不會選擇任何行。我們記得列函數傳回對列作為整個單元的引用,因此整個列的資料永遠不會等於 14。 |
| 因此,解決方案是使用帶有行下標的列函數(該行下標僅表示當前行,無論 select where 正在評估時是什麼),或者您可以使用 as 列函數來選擇行。 |
| 由於多種原因,在公式中使用 JSL 變數可能會出現問題。 JSL 變數的生命週期僅限於目前 JMP 會話,且隨著變數值的變化,公式的結果也會改變。 |
| 除非您查看公式編輯器中的公式,否則您可能不會意識到有問題。 |
| 那麼讓我們來看看我們的範例。在這裡,我只是打開一個資料表並建立一個我想要求和的列列表。 |
| 我正在建立新的公式列,並在 sum 函數中使用 JSL 變數。那麼讓我們來運行一下吧。我們可以看到我們的新列已建立並填充了資料。但讓我們來看看公式編輯器。我們從未說過我們的 JSL 變數在 sum 函數中使用。 |
| 當我們忽略這一點並對依賴列之一進行更改時,我們也注意到我們的列公式沒有自動更新。 |
| 因此,讓我們儲存並關閉 JMP,儲存該表並關閉 JMP。 |
| 我們將重新開始。 |
| 現在請記住,該 JSL 變數的生命週期僅限於先前的 JMP 會話。那麼讓我們打開桌子看看會發生什麼事。 |
| 我們注意到我們的變數...列公式仍然沒有再次計算。當我們查看它時,我們仍然看到 JSL 變數在那裡,但現在它下面有一條紅線。我們將滑鼠懸停在它上面,我們看到名稱未解決的錯誤。 |
| 如果我們嘗試重新評估公式,我們確實會收到錯誤訊息,並且忽略錯誤將導致我們的所有資料都變為遺失。那我們該如何解決這個問題呢? |
| 當您在公式中使用變數時,您需要執行一些操作來指示 JMP 在計算公式之前將變數替換為其值。您可以使用替代品,但今天我們將示範表達式函數。那麼讓我們關閉這張表。 |
| 我們將開啟該表的新副本並重新建立列清單。 |
| 現在讓我們看看我們如何解決這個問題。 |
| 因此,eval 表達式函數告訴 JMP 計算並替換其中的任何變數...其參數中包含在 EXPR 函數中的變數。 |
| 然後它將傳回未計算的表達式。因此,在此程式碼中,JMP 將取代表達式 SAT 分數,並將其替換為我們的欄位清單。 |
| 因此,讓我們運行這一部分,看看會發生什麼。我們確實看到 sum 函數現在有我們想要求和的列列表,而不是變數。 |
| 但它實際上並沒有為我們創建專欄。它只是傳回這個表達式。因此,為了對其進行評估,我們在 eval 表達式函數周圍新增了一個 eval 函數。 |
| 這將導致 JMP 在替換發生後計算整個新清單達式。所以本質上,電子郵件說,運行...運行 eval 表達式返回的內容,就是這個。 |
| 因此,讓我們運行它,我們可以看到我們的列現在已創建,並且我們擁有了預期的數據。 |
| 我們的公式不再有我們的變量,它有我們的列列表。 |
| 當我們更改依賴列中的資料時,我們的公式現在會自動更新。 |
| 所以現在我要把這個問題交給賈斯汀,讓他談一些需要避免的錯誤。 |
| 賈斯汀·奇爾頓 | 好吧,我們看到人們犯的另一個錯誤是當他們要設定列屬性時,語法可能有點棘手。所以在我們討論細節之前 |
| 我們先從列屬性的角度來談談什麼是列。所以本質上一列只是一個 |
| 該屬性資訊的儲存庫。它不進行任何語法檢查來確保 |
| 你給它的東西是正確的,這使它能夠儲存你想要的任何東西。這意味著這是因為屬性的使用者期望某些內容採用特定的格式,無論是 JMP 平台、使用列屬性或 JSL 應用程式。 |
| 讓我們來看一個簡單的例子。 |
| 在這裡,我們將開啟一個稱為列屬性的表,僅供測試之用。我們有一列稱為 NPN1,一列稱為 test。此列有規格限制和存取屬性,但我們想要 |
| 新增要測試的規格限制屬性。所以我們這裡有我們的想法 |
| 是設定規格限制列屬性的正確語法。我們運行這個並沒有給我們一個錯誤,但是當我們 |
| 查看該列,該列有規格限制。 |
| 你可以,但你可以看出這是不正確的。當我們要求根據我們的規格限制進行製程能力分析時, |
| 當我們運行該程式時,我們確實得到了 NPN1 的結果,但沒有得到測試列的結果。這是因為測試列的規格限制屬性中儲存的內容不正確。 |
| 因此,如果您已經知道如何使用設定的屬性規格限制,則可以採用一種方法, |
| 您可以將屬性訊息傳送到 NPN1 列,我們知道該列是正確的。因此,如果我們只運行這一行,我們就會得到正確的語法。 |
| 這實際上向我們表明,這實際上應該採用列表形式,而不是單獨的參數。因此,另一種方式,如果您不熟悉 get 屬性,您可以轉到您知道正確的列並複製列屬性。 |
| 然後您可以將其貼到腳本中,您將看到新增了列屬性以及幾個設定屬性。所以新增列屬性只是批量處理多個設定屬性的一種方法。我們可以刪除它,我們可以刪除額外的存取權限 |
| 財產。因此,一旦我們完成刪除,我們就可以使用此設定屬性透過發送運算符將其發送到我們的測試列。所以現在當我們運行這個時, |
| 我們...它...它已經覆蓋了我們的規格限制,但我們可以透過使用我們的規格限制運行相同的發行版來確認這一點。 |
| 因此,您可以在這裡看到我們對兩個色譜柱都有製程能力分析。這只是如何取得規範限制的一個範例,但這同樣適用於您需要套用並取得 JSL 語法的任何列屬性。 |
| 因此,我們要討論的下一個錯誤是操縱調度命令。那什麼是調度指令呢? |
| 當您執行紅色小三角選單的儲存到腳本視窗或儲存到剪貼簿時,它會出現在您儲存的腳本中。 |
| 當您新增參考線之類的內容或變更其他內容(例如關閉輪廓框)時,它就會出現。該命令是作為 JMP 重新創建圖形的內部方式而開發的 |
| 與您所做的定制。並沒有計劃讓用戶 |
| 使用動態變數自訂它。這意味著調度命令中的某些參數不接受 JSL 變數。那麼讓我們來看一個可能發生這種情況的範例。這是一個腳本。我們有一個 |
| 表和一個稍後將使用的字串變數。這本質上就是保存到腳本視窗返回的內容。所以當我們運行這個時, |
| 我們可以看到我們的調度命令設定了測量軸的最小最大和增量 |
| 這裡設定從 0 到 1.4。現在我們可以看到調度命令依賴於 |
| 此處的輪廓框標題,但該輪廓框標題實際上是基於我們的 y 輸入。假設我們希望這是來自使用者的動態輸入,並且我們擁有這個變數。我們可以使用 Y 變數。 |
| 但是我們還需要在此處使用該列的名稱。因此,當我們執行此命令時,您實際上會看到我們沒有獲得正確的軸設定 0.4 到 1.2,這不是......所以這意味著我們發送的內容沒有被處理。 |
| 所以有幾種方法可以解決這個問題。第一個是使用 Wendy 幾分鐘前談到的 eval 表達式解決方案。所以在這裡你可以看到我們有相同的 eval 表達式。我們實際上想要包裝我們在上一個範例中嘗試的串聯 |
| 這裡。 |
| 所以 eval 表達式會說評估整件事情。所以當我們運行 eval EXPR 時, |
| 它只是用我們的連接字串替換整個內容,然後記住當我們進行評估時, |
| 它運行該表達式。所以這裡我們有 0 到 1.4。這是一種方法。 |
| 但有時它仍然會變得有點棘手。你應該如何真正操作這些調度命令,因為你仍在使用調度命令,並且你必須知道它們是如何工作的。因此,最常見的方法是完全刪除此調度命令。 |
| 因此,使用我們所說的顯示框下標。因此,在這裡我將使用刪除的調度命令來運行它,並且我們有原始的軸設定。 |
| 然後我們要做的是,在我們真的不知道如何寫這個之前,只是看看它。所以我們要轉到這個圖標,這個輪廓框,右鍵單擊 |
| 編輯和顯示樹結構。所以,這向我們展示了這個大綱框中的顯示框樹結構,並且在這個大綱框中,您可以看到這個 axix 框是我們要更改的框。所以在這個輪廓框中是軸框一。 |
| 那我們就可以去寫我們的腳本了。我們使用這個報表函數來取得平台的報表層OBJ1。 |
| 然後,根據我們的列名稱,我們下標以取得我們知道應該是的大綱框標題。 |
| 然後,我們希望…我們希望盡可能具體,這樣,如果 JMP 的未來版本發生變化,我們就不太可能出現問題。 |
| 因此,在其中,我們需要軸盒 1,這就是我們獲取該軸盒的方式,然後我們可以從調度命令中獲取相同的信息,並將它們轉換為我們發送到軸盒的消息。 |
| 然後您可以在這裡看到現在我們的軸設定從 0 到 1.4。 |
| 因此,另一種更強大的方法是使用 XPath。它執行相同的操作,但可能稍微複雜一些,但也允許在 JMP 的未來版本中提供更大的靈活性,因為您可以使用有關框的基礎資料。 |
| 因此,我們要討論的最後一個錯誤是只使用全域名稱空間。所以 |
| 你可能不知道,但是當你創建一個符號而不指定它的去向時,它就會進入全域命名空間。因此,當您只是為了個人使用而模擬某些東西時,這對於快速腳本非常有用, |
| 但對於您發送給同事的腳本或您在社群上發布或添加的腳本來說,這可能不是一個好主意。 |
| 關於 JMP 中範圍界定和名稱查找如何運作的更多詳細資訊。您從該圖中的底部開始。局部作用域可以是任意數量的作用域,其中包括函數和局部框。 |
| 因此,最重要的是,如果它找不到該符號,或者您沒有指定它進入本地,這取決於您是在書寫還是閱讀, |
| 然後是here範圍,基本上每個文件都有一個範圍。還有全域範圍,它本質上是 JMP 會話的範圍之一。然後在右側,我們有名稱空間範圍,這是您確實必須明確查找的內容,以便 |
| 使用權。讓我們來看一個例子。這只會刪除我的所有符號,並且由於我沒有指定它們應該去哪裡,因此它將進入全域變數。所以 x 是 5。 |
| 有一個 |
| 我想使用的變數 x 。我不會指定將其放在哪裡。所以我要把它設定為 10。 |
| 但是當你回到你的腳本時,也許這是你設定的一些變量,然後你在按鈕上有一些回調...按鈕 |
| 依賴該變數的操作,然後您去使用它,並且該變數已對您進行了更改,這可能是不需要的。 |
| 那我們可以透過哪些方法來解決這個問題呢?嗯,最簡單的方法是使用預設的名稱(1)。這意味著,除非您明確告訴它要去那裡,否則什麼都不會出現在全域範圍內。那麼讓我們來看看 |
| 在這 |
| 例子。所以我們所做的就是將此名稱預設為添加到此處(1)。它可以與......通常它位於腳本的頂部,但它實際上可以去任何地方。 |
| 我要去,我要清理我的符號並將這個變數 x 設定為等於 5。 |
| 說的是我想訪問你的,你的x。但實際上,這個 x 永遠無法存取此命名空間中的這個 x。所以 |
| 讓我們複製部分腳本並執行 X 等於 50。 |
| 那麼右手腳本中的 X 是 50,但這對左手腳本中的 X 沒有影響。這就是,這是輕鬆將符號與其他腳本和應用程式分開的好方法。 |
| 另一個選項是使用自訂命名空間。這有點高級,但功能非常強大。所以我又來了...清除我的 |
| 符號,然後建立一個新的命名空間,在命名空間內設定變數 x 並顯示它。所以它的值為五。 |
| 你這裡還有另一個腳本。也許這是你的腳本之一,你知道 |
| myNS 存在。所以你可以嘗試訪問它,你可以做得很好,因為你知道它的名字。但邪惡之人在您不知情的情況下更改您的符號的可能性要小得多。所以 |
| 我可以更改這個符號,它仍然是 10,但如果我只執行 X,它不會對命名空間中 X 的結果產生任何影響。 |
| 我將把它交給溫迪,她將告訴我們一些被忽視的資源。 |
| 溫蒂·墨菲 | 謝謝你,賈斯汀。您可以使用許多資源來了解有關 JSL 的更多信息,其中許多資源都是免費的。我們在這裡為您連結了一些更常見的地方,供您查看和了解有關 JSL 的更多資訊。 |
| 我們還提供您可以聯繫的技術支持,並且還有幾本有關該主題的書籍。當然,我們始終鼓勵您查看我們的培訓資源以及他們為您制定的計劃。 |
| 請務必查看 JMP 社群上與本次簡報相關的論文,因為我們也為您介紹了更多錯誤,但我們今天沒有時間討論這些錯誤。感謝您的觀看。 |