揚聲器 | 成績單 |
| 溫迪·墨菲 | 您好,感謝您今天參加我們的演講。 我們很高興與您討論不同經驗水平的腳本作者遇到的常見場景。 |
| 我們的目的是解釋正在發生的事情,以便您擁有避免這些錯誤的工具和知識。 那麼讓我們開始吧。 |
| 也許因為默認情況下它沒有打開,所以很容易忘記檢查日誌中的消息。 但日誌包含有關最近腳本執行的有用信息。 那麼讓我們在 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 中範圍界定和名稱查找如何工作的更多詳細信息。 您從該圖中的底部開始。 局部作用域可以是任意數量的作用域,其中包括函數和局部框。 |
| 因此,最重要的是,如果它找不到該符號或者您沒有指定它進入本地,具體取決於您是在書寫還是閱讀, |
| 然後是這裡的範圍,基本上每個文件都有一個範圍。 還有全局範圍,它本質上是 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 社區上與此演示文稿相關的論文,因為我們還為您介紹了更多錯誤,但我們今天沒有時間討論這些錯誤。 感謝您的觀看。 |