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