腳本中的迭代所以這個演示說明瞭如何使用 For 函數進行迭代。 到目前為止,我們已經使用帶有日誌的腳本編輯器來測試我們的腳本並觀察結果。 但是現在我們想用調試器來看看。 所以我打開了一個腳本編輯器窗口,我將首先輸入 Names Default to Here。 我會輸入那個布爾值,我現在不添加空格。 我將實際上在一行上鍵入所有內容,然後讓自動重新格式化為我清理內容。 所以我將輸入一個分號,然後輸入 For,開括號,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 without breakpoints。 因為我現在沒有任何斷點,所以它們會做同樣的事情。 如果我現在想使用斷點,我將使用最左側的這個按鈕。 所以我會點擊那個。 它讓我知道程序執行將終止,除非我重新啟動,我很快就會這樣做。 唯一的選擇是關閉調試器。 但是在我重新啟動之前,我想在下面顯示腳本的面板中轉到此處的 Locals 選項卡。 並且默認的命名空間是Here,這是我在網上調用的,你可以看到在運行腳本的最後,a的值為b的值為i的值為所以現在我想使用調試器在迭代的每個步驟中查看 a、b 和 i 的值。 所以我要點擊那個重啟按鈕。 我想在行添加一個斷點 為此,我單擊行號的右側。 並且您可以擁有任意數量的斷點。 在這個簡單的腳本中,我們真的只需要一個。 所以這意味著我們將評估 line 並設置 Here 命名空間。 然後在 for 循環中,我們將評估初始化參數。 我們將評估測試。 我們將評估 for 循環的主體,它就是 Show 函數。 然後我們將暫停,我們將在 Locals 選項卡中看到值。 讓我切換回那個。 然後當我再次單擊運行時,我們將更新、進行測試、運行主體並暫停,然後查看這些值。 我們將繼續這樣做,直到測試失敗並退出循環。 所以我不想選擇任何東西。 我將使用左側的運行按鈕。 同樣,我不想在沒有斷點的情況下運行它。 所以我會運行這個。 你可以看到我們在評估之後已經停在了線上。 a、b、i 的值分別為 和。 要運行迭代的下一步,我再次單擊“運行”按鈕。 現在我看到 a、b 和 i 的值分別是 和。 我可以再跑一次。 我們達到了 a、b 和 i 的最終值。 我收到程序執行已終止的消息。 如果我想做其他事情,我可以重新啟動。 我可以單擊停止按鈕。 或者我可以使用右上角的 X 關閉。 我會繼續點擊停止按鈕。 這樣就可以將控制權返回給我原來的 JMP 會話。 現在讓我們假設我們已經測量了一些正在生產的化合物的固化時間。 在生產過程中,每次運行都會進行五次採樣,我們確定每個樣品的固化時間。 我們想查看每個樣品的固化時間分佈。 因此,在課程日誌中,我將在部分中單擊“治療時間數據”。 我們在編寫腳本時推薦的一件事是交互式地嘗試,以開始確保您嘗試做的事情是可行的。 所以我想要治愈時間的直方圖,所以我將做一個簡單的例子來開始。 我將進入分析菜單,選擇分佈。 我會把 Cure Time 放在那個 Y 角色中。 再次記住,這裡的角色是 Y。 我會點擊確定。 所以看著這個,我想,嗯,這很棒。 這正是我想要的所有五個固化時間分佈。 這就是我想要使用的平台。 我整理了一個腳本的小模板來重新創建這個報告。 讓我回到主窗口並打開它。 所以這個腳本與分發平台啟動,那個 Y 角色,然後以 Cure Time 作為字符串的列函數將重新創建那個報告。 所以我要根據這個模板寫一個循環。 所以我將繼續關閉這個 Cure Time 窗口並導航回我的腳本編輯器並清除內容,這樣我就可以使用同一個窗口。 再一次,我將使用 Names Default to Here 開始我的腳本。 和以前一樣,我會讓 JMP 通過自動重新格式化為我清理腳本。 所以我的 for 循環將從參數 c 開始。 我將給 c 賦值。 這是我要初始化的唯一變量。 我會打一個逗號。 測試將 c 小於等於列數。 提醒一下,如果您正在使用大型數據表,則最佳實踐可能是計算循環外的列數,將結果存儲在變量中,然後讓該變量成為您所需要的'正在將 c 與。 在這種情況下,它是五列,因為我們從第二列開始。 總共有五列。 所以我不太擔心每次都重做這個計數。 但最好的做法是把它拉出來。 之後我會輸入一個逗號。 更新參數將只是 c 和後增量運算符,兩個加號,另一個逗號,然後我將在括號中鍵入 Distribution,y,再次打開括號,鍵入 column,然後只需輸入 c--計數器——在那些括號中。 我現在要箭頭,以確保我的所有括號都匹配。 實際上,如果我在這裡遺漏了一個右括號,並且我嘗試重新格式化,我會收到一條消息,指出缺少某些內容。 所以重新格式化實際上是進行一些調試的簡單方法。 我將輸入分號。 然後我將繼續使用重新格式化腳本按鈕。 然後我將繼續運行腳本。 我得到的腳本是按原樣編寫的,每個觀察固化時間值都有一個單獨的窗口,因為我正在啟動分發——如果我們回到腳本編輯器窗口——我將再次啟動分發平台在迭代的每一步。 但是,如果您熟悉分佈,我將返回分析菜單,選擇分佈,然後將所有五個固化時間值放在那個 Y 角色中。 如果您熟悉分發,就會知道您可以在同一個窗口中獲得所有這些。 因此,在 Journal 中,預先編寫了一個腳本,用於循環使用所有列名構建 Y 角色,並在同一窗口中生成包含所有五個分佈的相同報告。 所以在我開始之前,我想繼續關閉所有這些報告窗口。 我將來到菜單欄並在窗口下選擇關閉所有報告。 然後我會找到日記。 我想點擊腳本,Cure Time Distributions。 我們將在調試器中完成這個。 因此,我將討論在該調試器環境中的每一步發生的情況,而不是在此處的腳本編輯器窗口中。 所以我將右鍵單擊並選擇調試腳本。 同樣,請記住,我們可以通過多種方式啟動調試器。 我想在 line 處添加一個斷點,以查看迭代的每一步會發生什麼,就像我們在前面的簡單示例中所做的那樣。 而且我還想在 c 變量和 yCol 變量上添加一個監視。 因此,我將轉到 Watch 選項卡。 我將單擊綠色加號添加手錶。 所以這是我可以查看腳本中特定變量的一種方式。 現在在這裡,我沒有太多的變量。 但是,如果您有一個包含很多變量的大腳本,並且在調試時只需要注意一些變量,那麼使用 Watch 選項卡是一個很好的方法。 所以我會點擊那個綠色的加號來添加手錶。 我將鍵入變量 c 並單擊確定。 然後我還想在變量 yCol 上添加一個監視,然後單擊“確定”。 現在,在我開始運行它之前,我確實想談談整個腳本中發生的事情。 然後我們會在運行調試器的過程中看到這一點。 所以第一行是創建一個名為 yCol 的變量。 yCol 將存儲分發平台的 Y 分析角色,後跟空括號,因為我的循環將通過在 Y 角色後面的括號中添加列名來構建這個表達式。 我用 Expr 引用它,因為如果您只是嘗試說 yCol 並在其後用括號分配值 y,您會收到錯誤,因為 JMP 不會將其識別為已定義的變量。 它不承認它是一個函數。 所以我只想讓這個字面值存儲在 yCol 中,而不需要 JMP 嘗試評估它。 所以這就是線會做的事情。 通過的行是我的 for 循環,我們從列開始我們迭代直到用完列。 再一次,在生產級腳本中,特別是如果可能有更大的數據表,我們想要計算循環外的列數,將其放入變量中。 然後 for 循環的主體只是簡單地添加列 c,因此將第一輪列到存儲在 yCol 中的表達式中。 並且 Insert Into 不會嘗試評估它的第一個參數。 所以我不必對 yCol 變量做任何特別的事情。 它只是查看它,然後執行操作,在這種情況下,將列添加到 y 之後的括號中。 Show 函數僅用於說明目的,讓我們了解每一步發生的情況。 那一塊,如果我不使用調試器,它會出現在日誌中。 所以我對值進行了監視,這相當於使用 Show 函數。 我們更新。 我們測試,假設 c 仍然小於或等於列數,我們將下一列插入到 yCol 中。 然後,一旦循環完成,換句話說,我們用完了列,我們就有了最後一行代碼,我將從內到外討論這個問題。 我們想使用插入函數來修改分佈表達式。 我們使用 Insert 而不是 Insert Into,因為分發是 JMP 中內置的平台啟動。 用戶實際上不能修改分發本身。 我們可以修改使用分佈的表達式。 所以我們使用插入。 然後我們將分佈包裝在 Expr 函數中,這樣 JMP 就不會嘗試評估分佈。 如果我啟動了——我將突出顯示這一點——如果我只是運行這段代碼,JMP 會說,嘿,你沒有給我 Y 角色所需的參數。 所以它會給我分發平台的啟動。 然後用戶會將他們的列放入其中,但實際上我們不會——這會破壞我們腳本的目的,對吧? 所以這是第一個論點。 第二個參數——如果我只是將 yCol 作為第二個參數,JMP 會嘗試評估它。 它會看到——在我們完成循環之後,你會看到它會是什麼樣子。 但它只會看到帶有括號的大寫 Y 和一堆列名。 這不是 JMP 知道如何處理的事情。 它不會將其識別為變量名或函數。 因此 Name Expr 使我能夠查看存儲的內容和 yCol 而無需嘗試對其進行評估。 存儲在 yCol 中的未計算表達式將在分發後放入括號中。 然後因為,一旦我這樣做了,所有列中具有 Y 角色的分佈仍然被引用,我們將整個東西包裝在 Eval 中。 當我們回到 JMP 的常規實例並將其進一步分解時,我們可以進行處理。 所以我有我的手錶。 目前,這些變量是未定義的。 所以這就是價值的體現。 讓我們跑到第一個斷點。 因此,在我們更新之前的第一次運行之後,c 存儲了 And 現在 yCol 的值,而不是只是一個帶空括號的 Y,它具有 Column Cure Time 記住從我的小模板中你可以在後台看到 -我無法導航到它,因為調試器處於活動狀態——但這就是為一列生成該分佈的原因。 所以我將在下一次迭代中再次運行。 現在 c 等於並且 y 分析角色是啟動兩個固化時間列。 我再跑一次。 現在我們有三個。 我可以繼續這樣做。 您可以在後台的日誌中看到,由於 Show 功能,這些結果正在顯示。 所以我會繼續這樣做,直到我們退出循環。 並且所有五個固化時間列都已存儲——這在 JMP 常規會話的日誌中更容易看到——但現在這些都存儲在 yCol 中。 所以程序執行已經終止。 我將繼續並單擊調試器中的停止。 因此,現在已經評估了最後一行。 我在同一個窗口中擁有所有五個直方圖的固化時間分佈。 現在讓我們再次簡短地回到 Script Editor 窗口來討論這一行,因為我認為思考我們如何從內到外構建表達式很重要。 因此,我將運行它並創建一堆錯誤,以確保我們清楚地知道我們為什麼要按照我們的方式編寫它。 所以我要註釋掉預先寫好的行。 回到我在調試器實例中的描述方式,我將輸入單詞 Insert。 而且,當您不熟悉腳本編寫時,何時使用 Insert,何時使用 Insert Into,可能需要反複試驗。 但同樣,在這種情況下,我正在嘗試——我需要啟動一個具有特定分析角色或分析角色中的特定列的平台。 但我無法修改平台。 我只能修改用戶創建的變量。 這些被稱為 L 值。 所以讓我們試試這個。 我將為該啟動鍵入 Distribution,打開括號,關閉括號,鍵入逗號,然後嘗試插入 yCol。 同樣,我是從一個天真的角度來看的,我想要存儲在 yCol 中的內容以及分發後的括號。 所以讓我們看看當我運行這一行時會發生什麼。 [ERROR CHIME] 我收到一個錯誤,名稱未解析。 Y 在訪問或評估所有列的 Y。 因此,如果我不理會這一點,那就意味著 JMP 試圖對此進行評估。 它不能。 所以我們得到了一個錯誤。 所以這沒有完成。 同樣,當我們需要檢索存儲的表達式或引用的表達式而不對其進行評估時,我們使用的函數是 Name Expr。 所以我要換行——哎呀——開括號。 我將把 yCol 包裝在 Name Expr 中。 你可以測試一下。 那麼會發生什麼。 如果我只是運行 yCol,你會看到我們剛剛得到的錯誤。 如果我運行 Name Expr yCol,那麼您可以在日誌中看到——哎呀,我正在嘗試調整它的大小。 您可以在日誌中看到 JMP 沒有給我一個錯誤。 它只是返回引用的表達式。 所以現在當我嘗試運行 line 哦,好吧,這一次,問題是——所以這次 JMP 沒有遇到 yCol 變量的問題。 但現在它看到了沒有所需價值的分發。 所以我不希望 JMP 推出這個平台。 我會取消的。 我想將分佈包裝在 Expr 中,因此 JMP 根本不會嘗試評估它。 同樣,您可以突出顯示它並運行它只是為了測試它,好的,這不會導致任何問題。 現在,當我運行它時,如果我查看日誌,就會發現我運行的代碼行。 這是結果,具有 Y 角色的分佈以及其中包含的所有列。 那麼最後一部分,正如您在行中看到的那樣,是包裝整個事情——這只是這樣做的一種方法——但是將整行包裝在 Eval 函數中。 我運行它。 還有一個包含所有分佈報告的分佈窗口。 所以我只是想在我開發這個的過程中犯一些錯誤,因為我認為這有助於人們理解為什麼我們以我們的方式寫這些東西。 現在我要提到的另一件事是,我們通常會推薦——當我進行第一次固化時間分佈時,如果你還記得的話,我去了分析,分佈,我只是將固化時間放在 Y 角色中,然後單擊確定。 我們通常建議您只獲取 JMP 為此編寫的腳本並將其用作編寫此循環的基礎,在本例中。 我沒有對發行版執行此操作的唯一原因是我剛剛擁有 y 分析角色的語法是較舊的語法。 如果我要轉到分佈旁邊的紅色三角形並選擇將腳本保存到腳本窗口,則較新的語法會為每列單獨指定它是連續分佈還是名義分佈。 因此,與舊語法相比,該循環中的腳本要多一點。 較舊的語法可以正常工作。 但我可能會推薦使用這種較新的語法。 這只是一個稍微複雜的循環。 但是對於大多數平台,使用 JMP 為我們編寫的腳本就可以了。 我要關閉這個腳本窗口。 我們將再看一個以交互方式做某事的示例。 這一次,我將捕獲該腳本。 雖然,我的循環是預先編寫的。 假設我想查看所有五個固化時間值的控製圖。 因此,我將通過進入我的分析菜單以交互方式開始。 在質量和流程下,我將選擇控製圖生成器。 我想把 Day 放在那個小組角色中,把 Cure Time 放在 Y 角色中。 然後,控製圖生成器會自動為我提供固化時間的單獨測量值和移動範圍圖,這就是我的出發點。 我將單擊完成以隱藏控制面板。 然後我將轉到控製圖生成器旁邊的紅色三角形並將腳本保存到腳本窗口。 所以這個腳本編輯器窗口——這個腳本編輯器窗口。現在包含將重新創建該結果的控製圖生成器。 現在只是為了使它與我預先編寫的腳本相匹配,我將刪除設置大小的行。 當然,您不必這樣做。 我只是為了演示目的而對此進行了簡化。 所以我們看到的是控製圖構建器是平台啟動。 然後我們有一些選擇。 我們正在使用該布爾值隱藏控制面板我們沒有顯示功能。 然後是這個變量角色。 並且變量角色有一個子組。 對於所有固化時間值,這將是相同的。 然後它與治愈時間有一個 Y 作用,在這種情況下,治愈時間 所以我們實際上需要做的是建立三件事。 我們需要使用固化時間列建立 y 分析角色,通過添加來構建其中的變量部分——一旦我們在 Y 角色中擁有所有固化時間列——在此處添加。 然後將該變量放入控製圖生成器啟動中。 因此,讓我們回到日誌並單擊 Cure Time Control Charts。 再說一遍,建立 y 分析角色是三個部分。 這就像我們所做的一樣——這些線路就像我們所做的,我們在分發中看到的一樣。 而且我只是對變量使用不同的命名約定。 然後我們要建立變量塊。 所以我只是使用插入功能。 我有子組 Day 的變量,這對於所有固化時間值都是相同的。 但我不希望 JMP 嘗試評估單詞變量。 我會得到一個錯誤。 所以我將使用 Expr。 然後就像在該腳本中的分發一樣,我正在檢索存儲在 yExpr 中的列列表並將其添加到變量中。 然後在這個腳本中,我實際上是在為控製圖生成器構建基本模板,沒有變量片段並將其存儲在變量 ccExpr 中。 最後,我將添加變量行。 同樣,如果我們在後台查看該代碼,該變量行將被添加到 Control Chart Builder 啟動中。 在這種情況下,我只是對這兩個都使用了 Name Expr,因為它們是我已經定義的引用表達式。 我將該結果存儲在它自己的變量中,而不是將這個插入函數包裝在 eval 中。 然後我在我的腳本中使用 cc,這將評估構建的表達式。 不過,讓我們繼續,並將其帶入調試器。 所以我將右鍵單擊並選擇調試。 我將導航到 Watch 選項卡。 我想從我的其他腳本中刪除當前的手錶變量,所以我只需單擊按鈕即可刪除所有手錶。 然後我將為這個腳本中的四個變量添加四個監視。 所以我會點擊綠色加號。 首先,我將輸入 yExpr,然後單擊“確定”。 我將再次單擊綠色加號,然後添加 varExpr。 我是否將其大寫並不重要,但我只想與腳本中的文本保持一致。 所以我會點擊確定。 我想添加 ccExpr。 單擊確定。 最後,我想添加 cc,然後單擊 OK。 我要設置三個斷點,因為我想在這裡停在三個不同的位置。 所以第一個斷點將在線 這將讓我看到迭代的每一步發生了什麼。 下一個斷點將在線所以我們將暫停以查看 varExpr 中存儲的內容。 最後,我們將在線下一個斷點來查看 cc 中存儲的內容。 然後,一旦我們駁回這一點,就會對其進行評估。 我將使用 Step Over 按鈕來執行調試器。 所以我點擊那個。 線被評估,我們進入循環。 如果我們查看下面的 Watch 選項卡,您可以立即看到存儲的內容和 yExpr。 然後當我再次單擊 Step Over 時,我們轉到第一個斷點。 當我第三次單擊 Step Over 時,現在您可以看到 yExpr 中包含 Column Cure Time。 我將再次單擊 Step Over 以轉到該斷點。 再次單擊。 現在我們已經將 Cure Time 插入到 Y 角色中。 所以我會繼續這樣做,直到我們完成 for 循環。 如果您查看此內容,您會看到所有五個固化時間列都處於 Y 角色。 現在行將定義 varExpr。 所以現在這是子組 Day 的變量,然後是所有這些列的 Y 角色。 我將再次單擊 Step Over,這會將我們帶到我們定義 ccExpr 的位置。 您還可以在 Watch 選項卡中看到,這只是存儲 Control Chart Builder 啟動,但缺少其中的重要部分。 然後線是我們把所有東西放在一起的地方。 所以我會再跳過一次。 現在,如果您想檢查這一點,控製圖生成器、顯示控制面板等已將存儲在 varExpr 中的值添加到其中。 我將再單擊一次 Step Over。 程序執行終止。 我會點擊停止。 現在回到我的 JMP 常規會議中,您可以看到我已經為您的治療時間等提供了單獨的測量和移動範圍圖表。 所以這些例子,我們正在研究使用 For 函數,使用 Expr,使用 Insert 命名 Expr 函數,然後只是看看我們如何在這些簡單的上下文中使用調試器。 我將回到日記並單擊刪除全部保存無而不保存對我的任何腳本窗口的更改。 這將結束這個演示。