腳本中的迭代

所以這個示範說明如何使用 For 函數進行迭代。到目前為止,我們已經使用帶有日誌的腳本編輯器來測試我們的腳本並觀察結果。但現在我們想使用調試器來查看它。因此,我打開了一個腳本編輯器窗口,我將首先輸入“Names Default to Here”。我將輸入布林值,但目前我不會添加空格。我實際上要將所有內容都輸入在一行上,然後讓自動重新格式化功能幫我清理乾淨。所以我會輸入一個分號,然後對於,打開括號,a 等於分號,b 等於分號,i 等於逗號——所以我初始化三個變數。然後我將輸入測試,即 i 小於逗號,然後我將更新 b 和 i。因此 b 將更新 - b + 等於因此這是就地賦值函數,添加到函數,它將覆蓋 b 的當前值並將其增加一個分號,因為我正在更新兩件事,然後是 i ++,那個 ++ 再次是後增量運算符,它將就地添加到 i。然後是一個逗號,然後這個簡單循環的主體將是 Show 函數。我只會顯示 a、逗號、b、逗號——然後我會使用運算符實際呼叫乘法函數——所以 a 乘以 b。然後我將關閉所有括號,添加分號,然後右鍵單擊並重新格式化。現在有一件事 — — 嗯,這裡有兩件事要注意 — — 一是 JMP 為我添加了一些額外的分號。它看到我在第一個參數中將函數黏合在一起。它發現我在第三個參數中將函數黏合在一起。因此它添加了這些分號。它們不會造成傷害。實際上,我可能會從腳本中刪除它們,因為它們沒有必要,除非我要添加 - 將更多功能粘合在一起。我可能做的另一件事是重新排列它,以便每個論點都有自己的行。但是當我們進入調試器時,我希望它與課程 PDF 中的內容相符。因此,我將保留 JMP 重新格式化的方式,但去掉那些分號。因此,我們可以透過多種方式啟動偵錯器。您可以轉到“編輯”選單,其中有一個“偵錯腳本”選項。您可以看到鍵盤快速鍵是 Ctrl+Shift+R。您可以點選腳本編輯器視窗中的偵錯工具列按鈕。或者您可以右鍵單擊並選擇偵錯腳本。因為這是我向您展示的最後一個,所以我將繼續使用該方法。所以這個偵錯器是 JMP 的第二個實例。且原來的JMP實例被暫時中止。因此,如果有任何類型的交互,例如腳本所需的對話框,則偵錯器視窗將被暫停,直到您執行該操作。一旦完成,控制權就會回傳給偵錯器。然後,一旦您完成調試器,只需關閉它即可。您可以使用右上角的 X 或工具列中的停止按鈕。這將會傳回 JMP 的原始實例。因此,首先,我將按原樣運行這個循環,而不設置任何斷點。這裡有兩個按鈕。一種是Run,一種是不帶斷點的Run。由於我現在沒有任何斷點,所以它們會做同樣的事情。如果我有斷點並且想立即使用它們,我會使用最左邊的這個按鈕。所以我會點擊它。它讓我知道程式執行已終止,除非我重新啟動,我很快就會重新啟動。唯一的選擇是關閉調試器。但在重新啟動之前,我想轉到顯示腳本的下方面板中的「本機」標籤。預設名稱空間是在這裡,這是我在第 3 行調用的,您可以看到,在運行腳本結束時,a 的值為 b 的值為 i 的值為,所以現在我想使用調試器查看迭代每一步中 a、b 和 i 的值。所以我要點擊「重新啟動」按鈕。我想在第 行添加一個斷點,為此,我單擊行號右側。並且您可以擁有任意數量的斷點。在這個簡單的腳本中,我們實際上只需要一個。所以這意味著我們要評估行並設定此處的名稱空間。然後在 for 迴圈中,我們將評估初始化參數。我們將對測試進行評估。我們將評估 for 迴圈的主體,它只是 Show 函數。然後我們暫停一下,然後會看到 Locals 選項卡中的值。讓我再回到那個話題。然後,當我再次按一下「運行」時,我們將更新、進行測試、運行主體、暫停並查看這些值。我們會繼續這樣做,直到測試失敗並退出循環。所以我不想選擇任何東西。我將使用左側的“運行”按鈕。再說一次,我不想在沒有斷點的情況下運行它。所以我會運行這個。您可以看到,在評估完後,我們已停在線上。其中,a、b、i 的值分別為和。為了運行迭代的下一步,我再次單擊“運行”按鈕。現在我看到 a、b 和 i 的值分別是和。我還可以再跑一次。我們得到了 a、b 和 i 的最終值。我收到程式執行已終止的訊息。如果我想做其他事情,我可以重新啟動。我可以點擊“停止”按鈕。或者我可以使用右上角的 X 來關閉。我將繼續並點擊“停止”按鈕。這樣就將控制權回傳到我原來的 JMP 會話。現在讓我們想像一下,我們已經測量了正在生產的一些化合物的固化時間。在生產過程中,每次運行都會進行五次採樣,並確定每個樣品的固化時間。我們想看看每個樣品的固化時間分佈。因此,在課程日誌中,我將點擊“固化時間數據”部分。我們在編寫腳本時建議的一件事是,以互動方式嘗試操作,以確保所嘗試的操作是可行的。所以我想要固化時間的直方圖,所以我會做一個簡單的例子來開始。我將轉到“分析”選單,選擇“分佈”。我會讓 Cure Time 擔任 Y 角色。再次提醒,請記住這裡的角色是 Y。然後我將單擊“確定”。所以看到這個,我想,嗯,這很棒。這正是我所希望的所有五個固化時間分佈。這就是我想要使用的平台。我整理了一個可以重新建立此報告的腳本小範本。讓我回到主視窗並打開它。因此,此腳本透過分發平台啟動、Y 角色以及以 Cure Time 為字串的列函數來重新建立該報告。因此我將根據這個模板編寫一個循環。因此,我將繼續關閉此“Cure Time”視窗並導航回我的腳本編輯器並清除內容,以便我可以使用同一個視窗。再次,我將以名稱預設為此處開始我的腳本。和以前一樣,我將讓 JMP 透過自動重新格式化功能為我清理腳本。所以我的 for 迴圈將從參數 c 開始。我將為 c 分配一個值。這是我要初始化的唯一變數。我會打一個逗號。測試將 c 小於等於列數。需要提醒的是,如果您正在處理大型資料表,最佳做法可能是計算循環外的列數,將結果儲存在變數中,然後將該變數作為您要與 c 進行比較的變數。在這種情況下,它有五列,因為我們從第二列開始。總共有五列。所以我並不太擔心每次都要重新計數。但最好的做法是將其拔出。我會在那之後打一個逗號。更新參數將只是 c 和後增量運算子、兩個加號、另一個逗號,然後我將在括號中輸入分佈,y,再次打開括號,輸入列,然後將 c——計數器——放在括號中。我現在要用箭頭指向那裡,以確保所有括號都匹配。實際上,如果我在這裡缺少一個右括號,並且我嘗試重新格式化,我會收到一條訊息,提示缺少某些內容。因此重新格式化實際上是一種進行偵錯的簡單方法。我將輸入分號。然後我將繼續使用重新格式化腳本按鈕。然後我將繼續運行腳本。使用編寫的腳本,我得到的是針對固化時間值的每次觀察都有一個單獨的窗口,因為我正在啟動分發 - 如果我們回到腳本編輯器視窗 - 我會在每個迭代步驟中再次啟動分發平台。但是如果您熟悉分佈 - 我將返回到“分析”選單,選擇“分佈”,然後將所有五個固化時間值放在該 Y 角色中。如果您熟悉分發,您就會知道您可以在同一個視窗中獲得所有這些內容。因此,在日誌中,有一個預先編寫的腳本,用於循環建立具有所有列名的 Y 角色,並在同一視窗中產生包含所有五個分佈的相同報告。因此,在開始之前,我想先關閉所有這些報告視窗。我將進入功能表欄,在視窗下選擇關閉所有報告。然後我會找到日記。我想要點擊腳本“固化時間分佈”。我們將在調試器中完成這項操作。因此,我將討論在偵錯器環境中而不是在腳本編輯器視窗中每一步發生的情況。因此我將右鍵單擊並選擇“調試腳本”。再次提醒,我們可以透過多種方式啟動偵錯器。我想在行中添加一個斷點來查看迭代的每個步驟中發生的情況,就像我們在先前的簡單範例中所做的那樣。我還想對 c 變數和 yCol 變數添加監視。所以我要去「觀看」選項卡。我將單擊綠色加號來添加監視。這是我查看腳本中特定變數的一種方法。現在這裡,我沒有太多變數。但是如果您有一個包含大量變數的大腳本,並且在偵錯時只需要關注幾個變量,那麼使用“監視”選項卡是一種很好的方法。因此我將單擊綠色加號來添加手錶。我將輸入變數 c 並按一下「確定」。然後我還想對變數 yCol 新增一個監視,然後按一下「確定」。現在,在我開始運行這個之前,我確實想稍微談談整個腳本中發生的事情。然後,我們將在運行調試器的過程中看到這一點。因此第一行是建立一個名為 yCol 的變數。 yCol 將儲存分佈平台的 Y 分析角色,後面跟著空括號,因為我的循環將透過將列名新增至 Y 角色後的括號中來建立此表達式。我用 Expr 引用它,因為如果您只是嘗試說 yCol 並在其後用括號分配值 y,那麼您會收到錯誤,因為 JMP 無法將其識別為已定義的變數。它不將其識別為一個函數。所以我只想獲取儲存在 yCol 中的這個文字值,而無需 JMP 嘗試對其進行評估。這就是 line 的作用。這些行是我的 for 循環,我們從列開始,不斷迭代,直到用完所有列。再次,在生產級腳本中,特別是如果可能有更大的資料表,我們希望計算循環外的列數,並將其放入變數中。然後 for 迴圈的主體只是將列 c 加進去,因此將第一輪的列加入到儲存在 yCol 中的表達式中。並且 Insert Into 不會嘗試評估其第一個參數。所以我不需要對 yCol 變數做任何特殊的事情。它只是查看它然後執行操作,在本例中,將列添加到 y 後面的括號中。顯示功能只是為了說明目的,讓我們看看每一步發生的情況。如果我沒有使用偵錯器,那麼該部分就會顯示在日誌中。因此,我對這些值進行了監視,這相當於使用 Show 函數。我們更新。我們進行測試,假設 c 仍然小於或等於列數,我們將下一列插入 yCol。然後,一旦循環完成,換句話說,我們用完了列,我們就有了最後一行程式碼,我將從內到外談論這一點。我們想使用插入函數來修改分佈表達式。我們使用“插入”而不是“插入到”,因為分發是 JMP 內建的平台啟動。使用者實際上無法修改分佈本身。我們可以修改使用分佈的表達式。因此我們使用插入。然後我們將分佈包裝在 Expr 函數中,這樣 JMP 就不會嘗試評估分佈。如果我啟動 - 我只會突出顯示這一點 - 如果我只是運行這行程式碼的一部分,JMP 會說,嘿,你還沒有給我 Y 角色中所需的參數。因此它將為我提供分銷平台的啟動。然後用戶會放入他們的列,但我們實際上不會——這會違背我們腳本的目的,對嗎?這是第一個論點。第二個參數-如果我將 yCol 作為第二個參數,JMP 就會嘗試對其進行評估。你會看到——我們完成循環後它會是什麼樣子。但它只會看到帶有括號的大寫字母 Y 和一堆列名。 JMP 不知道該如何處理這個問題。它不承認這是一個變數名或函數。因此,Name Expr 使我能夠查看儲存的內容和 yCol,而無需嘗試對其進行評估。儲存在 yCol 中的未評估表達式將在分佈之後放入括號中。然後,因為一旦我這樣做了,所有列中具有 Y 角色的分佈仍然被引用,我們將整個內容包裝在 Eval 中。當我們回到 JMP 的常規實例時,我們可以進行進一步的分解。所以我有手錶。目前,變數尚未定義。這就是所顯示的值。讓我們跑到第一個斷點。因此,在我們更新之前的第一次運行之後,c 存儲了現在 yCol 的值,而不僅僅是帶有空括號的 Y,它具有列固化時間,請記住,從我的小模板中您可以在背景中看到 - 我無法導航到它,因為調試器處於活動狀態 - 但這就是僅為一列生成分佈的原因。因此我將再次進行下一次迭代。現在 c 等於且 y 分析角色正在啟動兩個固化時間列。我會再跑步。現在我們有三個。我可以繼續這樣做。您可以在後台日誌中看到,這些結果是由於 Show 功能而顯示的。所以我會繼續這樣做,直到我們退出循環。所有五個固化時間列都已儲存 - 這在 JMP 常規會話的日誌中更容易看到 - 但現在它們都儲存在 yCol 中。因此程式執行已經終止。我將繼續並單擊調試器中的“停止”。現在最後一行已經評估過了。我在同一個視窗中獲得了包含所有五個直方圖的固化時間分佈。現在讓我們再次簡要地回到腳本編輯器視窗來討論這一行,因為我認為思考如何從內到外建立表達式很重要。因此,我將運行這個程式並創建一堆錯誤,只是為了確保我們清楚地明白為什麼我們以這種方式寫出來。所以我要註解掉預先寫好的那行。因此,回到我在調試器實例中描述的情況,我將輸入單字 Insert。當您剛開始編寫腳本時,可能需要反覆嘗試何時使用“插入”,何時使用“插入到”。但同樣,在這種情況下,我正在嘗試 - 我需要啟動一個具有特定分析角色或分析角色中的特定列的平台。但我無法修改平台。我只能修改使用者建立的變數。這些被稱為 L 值。那麼讓我們來試試看。我將為該發射輸入 Distribution,打開括號,關閉括號,輸入逗號,然後嘗試插入 yCol。再次,我從一個簡單的角度來考慮這個問題,我想要儲存在 yCol 和分佈後的括號中的內容。那麼讓我們看看當我運行這一行時會發生什麼。 [錯誤提示] 我收到錯誤,名稱未解析。存取或評估所有列的 Y 中的 Y。因此,如果我駁回這一點,那隻是意味著 JMP 試圖評估這一點。不可能。所以我們得到了一個錯誤。所以這並沒有完成。因此,當我們需要檢索儲存的表達式或引用的表達式而不對其進行評估時,我們使用的函數是 Name Expr。所以我要包裝——哎呀——左括號。我要將 yCol 包裝在 Name Expr 中。你可以測試一下。那麼會發生什麼事呢?如果我剛剛運行 yCol,您就會看到我們剛剛遇到的錯誤。如果我運行 Name Expr yCol,那麼您可以在日誌中看到——哎呀,我正在嘗試調整它的大小。您可以在日誌中看到 JMP 並沒有給我帶來錯誤。它只是傳回引用的表達式。所以現在當我嘗試運行行哦,好吧,這一次,問題是 - 所以 JMP 這次沒有遇到 yCol 變數的問題。但現在它的分佈已經不再具有所需的價值。所以我不希望JMP推出這個平台。我將取消該操作。我想將分佈包裝在 Expr 中,因此 JMP 根本不會嘗試對其進行評估。再次,您可以突出顯示它並運行它以進行測試,好的,這不會導致任何問題。現在,當我運行這個程式時,如果我查看日誌,就會看到我運行的程式碼行。這是結果,具有 Y 角色的分佈以及其中包含的所有列。那麼,最後一部分,正如您在行中看到的那樣,就是將整個內容包裝起來 - 這只是一種方法 - 但要將整行包裝在 Eval 函數中。我負責運行它。還有另一個分發窗口,其中包含所有分發報告。因此,我只是想在開發過程中犯一些錯誤,因為我認為這有助於人們理解為什麼我們以這種方式寫出這些東西。現在我要提到的另一件事是,我們通常會建議 - 當我第一次進行固化時間分佈時,如果您還記得的話,我去了分析,分佈,我只需將固化時間放在 Y 角色中,然後單擊確定。我們通常建議您只抓取 JMP 為您編寫的腳本,並以此為基礎,在本例中,用於編寫此循環。而我沒有對分佈執行此操作的唯一原因是,我僅有的 y 分析角色的語法是一種較舊的語法。如果我轉到分佈旁邊的紅色三角形並選擇將腳本儲存到腳本窗口,則較新的語法會針對每列分別指定它是連續分佈還是名義分佈。因此,與舊語法相比,該循環中的腳本稍微多一點。舊的語法運作良好。但我可能會建議使用這種較新的語法。這只是一個稍微複雜一點的循環。但對於大多數平台來說,使用 JMP 為我們編寫的腳本就足夠了。我要關閉這個腳本視窗。我們將看另一個以互動方式執行某項操作的範例。這次,我要抓住那個腳本。雖然,我的循環是預先寫好的。假設我想查看所有五個固化時間值的控制圖。因此,我將通過進入“分析”選單以交互方式開始。在“品質和流程”下,我將選擇“控製圖生成器”。我想將 Day 放在該子組角色中,將 Cure Time 放在 Y 角色中。控製圖產生器會自動為我提供固化時間的單獨測量值和移動範圍圖,這就是我的起點。我將單擊“完成”來隱藏控制面板。然後我要轉到控制圖產生器旁邊的紅色三角形並將腳本儲存到腳本視窗。所以這個腳本編輯器視窗——這個腳本編輯器視窗。現在包含將重新建立該結果的控製圖產生器。現在,為了使它與我預先編寫的腳本相匹配,我將刪除設定大小的行。當然,你不一定要這麼做。我只是為了演示目的而簡化這一點。因此,我們看到的是控製圖產生器是平台啟動的。然後我們就有了一些選擇。我們透過使用布林值來隱藏控制面板,我們不顯示功能。然後就是這個變數的作用。且變數角色有一個子群。對於所有固化時間值來說這都是相同的。然後它與固化時間具有 Y 作用,在這種情況下是固化時間,所以我們實際上需要做的是建立三件事。我們需要使用固化時間列來建立 y 分析角色,透過添加來建立變數部分 - 一旦我們在 Y 角色中擁有所有固化時間列 - 就將其添加到這裡。然後將該變數部分放入控製圖產生器啟動中。因此,讓我們回到日誌並點擊“固化時間控製圖”。因此,再次強調,Y 分析角色由三個部分組成。這就像我們所做的一樣 - 這些線條就像我們所做的一樣,就像我們在分佈中看到的一樣。我只是對變數使用了不同的命名約定。然後我們要建立變數部分。所以我只是使用插入功能。我有一個帶有子組 Day 的變量,對於所有固化時間值來說,這些變量都是相同的。但我不希望 JMP 嘗試評估字變數。我會收到錯誤。所以我會使用 Expr。然後就像在該腳本中的分佈一樣,我檢索儲存在 yExpr 中的列的清單並將其新增至變數部分。然後在這個腳本中,我實際上建立了不包含變數部分的控製圖產生器的基本模板,並將其儲存在變數 ccExpr 中。最後,我要新增變數行。因此,如果我們再次查看後台的程式碼,則該變數行將被加入到控製圖產生器啟動中。在這種情況下,我對這兩者都使用了 Name Expr,因為它們是我已經定義的引用表達式。我將結果儲存在自己的變數中,而不是將此插入函數包裝在 eval 中。然後我在腳本中使用 cc,它將評估建構的表達式。不過,讓我們繼續,並將其帶入調試器。因此我將右鍵單擊並選擇“調試”。我將導航至“監視”選項卡。我想從其他腳本中刪除當前的監視變量,因此我只需單擊按鈕即可刪除所有監視。然後我將為這個腳本中的四個變數添加四個監視。所以我會點擊綠色加號。首先,我將輸入 yExpr,然後按一下「確定」。我將再次單擊綠色加號,然後添加 varExpr。我將其大寫並不重要,但我只是想與腳本中的文字內容保持一致。因此我將單擊“確定”。我想加 ccExpr。按一下“確定”。最後,我要新增 cc,然後按一下「確定」。我要設置三個斷點,因為我想在這裡的三個不同位置停下來。因此第一個斷點將在線,這將讓我看到迭代的每個步驟中發生的情況。下一個斷點將在線上,因此我們將暫停以便能夠查看 varExpr 中儲存的內容。最後,我們將在線上放置一個斷點來查看 cc 中儲存了什麼。一旦我們駁回了這個問題,我們就會對其進行評估。我將使用“Step Over”按鈕來執行偵錯器。所以我點擊了它。然後對線進行評估,然後我們進入循環。如果我們查看下面的「監視」選項卡,您可以看到目前儲存的內容和 yExpr。然後,當我再次單擊“Step Over”時,我們將轉到第一個斷點。當我第三次點擊“Step Over”時,您可以看到 yExpr 中包含“Column Cure Time”。我將再次單擊“Step Over”以轉到該斷點。再次單擊。現在我們已將 Cure Time 插入到該 Y 角色中。所以我會繼續這樣做,直到我們完成 for 迴圈。如果你查看這個,你會看到所有五個固化時間列都處於該 Y 角色中。現在行將定義 varExpr。現在這些變數具有子組 Day,然後是具有所有這些列的 Y 角色。我將再次點擊“Step Over”,這將帶我們到定義 ccExpr 的地方。您也可以在「監視」標籤中看到,它僅儲存了控製圖產生器的啟動,但缺少了其中一個重要的部分。然後我們將所有東西放在一起。因此我將再跨過一次。現在,如果您想檢查這一點,控制圖產生器、顯示控制面板等都已將 varExpr 中儲存的值新增至其中。我將再次單擊“Step Over”。程式執行終止。我將單擊“停止”。現在回到我的常規 JMP 會話中,您可以看到我已獲得您的固化時間等的單獨測量值和移動範圍圖。因此,在這些範例中,我們正在研究如何使用 For 函數、使用 Expr、使用 Insert 的 Name Expr 函數,然後也研究如何在這些簡單的上下文中使用偵錯器。我將返回日誌並單擊“全部刪除,不保存”而不保存對任何腳本視窗的更改。本次示威遊行就此結束。