Ready to learn about stringing everything together into an actual script?Ready to learn about stringing everything together into an actual script?Ready to learn about stringing everything together into an actual script?Ready to learn about stringing everything together into an actual script?準備好了解如何將所有內容組合到實際腳本中了嗎?歡迎回到我的關於腳本編寫基礎知識的系列聯合管理計劃。 這是專為您設計的系列中的第五篇文章。 如果您剛剛加入我們,您真的會想看看早期的條目該系列,因為這個太棒了。 以下是它們的鏈接供您查看:
好的? 還在? 你看過前面幾集嗎? 出色的! 向榮耀前進!
從幾週前的家庭作業中,我們都應該有一堆使用的 JSL 片段保存腳本到腳本窗口或腳本索引來獲取我們需要的代碼片段。 你做過做你的作業,正確的? 好的! 讓我們將所有內容串在一起形成一個實際的腳本。 但首先,我們得聊聊。
Mikey 的編碼寵物之一皮皮鬼
好吧,伙計們。 讓我暫時站起來談論一些事情。 當我們寫代碼的時候,我們必須總是評論一下吧! 我們不能對在我們之後閱讀我們代碼的人(包括我們自己)做出任何假設。
回到大學時,我參加了 Visual Basic 編碼課程。 我們學到的第一件事是如何註釋代碼和編寫偽代碼。 順便說一句,偽代碼是您在編寫代碼之前編寫的註釋,可幫助您確定需要做什麼(它們類似於我讓您編寫的遺留問題清單)第一篇文章)。 講師將評論和偽代碼稱為“成為編碼社區的好公民”。我們甚至會根據我們對提交的代碼的評論程度進行評分。 就是這麼重要。
事實是,您很少能夠完全控制誰可以看到您的代碼。 恰當的例子:在本博客系列中,我向您提供了有關如何對其他人的加載項進行逆向工程的分步說明。 我可以保證,編寫這些加載項的一些(如果不是大多數)人並不希望其他人偷看他們的代碼。 我還可以保證您不會在代碼中找到那麼多註釋來幫助您弄清楚發生了什麼,正如您希望的那樣。
您需要對代碼進行註釋,以確保稍後查看代碼的人可以輕鬆理解您在做什麼。 是的,評論是一件痛苦的事。 是的,這需要額外的時間。 但,不,你不能跳過這件事。 從長遠來看,它將帶來紅利。 我確實言行一致。 我有五年前編寫的插件,我仍然可以理解,因為我做了詳細的評論(而且我仍然記得這樣做是多麼乏味!)。
因此,那些已經編碼過的人,請確保對代碼進行註釋,以便其他人能夠理解您在做什麼。 那些正在學習的人,要養成並保持對代碼進行大量註釋的習慣。 現在,讓我從這個演講台上下來,向您展示如何做。
在 JSL 中發表評論
讓我們打開 JMP 並打開我們一直在使用的 Big Class Families.jmp 數據表。 如果您沒有保存上次會話中的腳本示例,請繼續並重新創建它。 你應該有類似這樣的東西:

有兩種方法可以將註釋添加到 JSL 代碼中。 第一種是使用雙正斜杠(“//”)註釋掉各個行。 斜杠之後直到回車(按鍵盤上的回車鍵)之前的任何內容都將被忽略。 我通常使用這種方法來進行簡短的內聯評論。 關閉您不想運行的單行代碼也很有用。 讓我們看看這意味著什麼:

第二種註釋方式用於您想要關閉大塊代碼或生成大塊註釋和文本的情況。 這種類型的評論稱為評論塊。 它是使用由正斜杠和星號(“/*”)組成的開始註釋標誌和由星號和正斜杠(“*/”)組成的結束註釋標誌來完成的。 以下是如何使用它的示例:

請注意,我不是在討論評論風格這裡。 這實際上取決於你。 隨著您的發展,您將形成自己的風格,甚至可能出於不同目的而採用不同的評論風格。 我的內聯註釋(如示例中的註釋)與我在應用程序之類的東西中所做的註釋完全不同。 重點是編寫註釋並在腳本中與您的操作方式保持內部一致。
整個系列中最難的部分
事實上,整個系列一直在引導接下來的項目。 要開始使用 JSL,您需要了解三個核心知識。 第一個是評論(請參閱本文前面的講道)。 第二個和第三個是如何命名事物和如何發送消息給他們。
我想可以編寫自己的方差分析算法(我的一位同事講述了一個非常有趣的故事)。 但是,通過消息告訴數據表使用 Fit Y by X 運行方差分析要容易得多,就像我們在上一集中學到的那樣。 JSL 的大部分內容就是基本工作流程(命名某個內容,向其發送消息)。 是的,您可以進入邏輯和循環、GUI 開發等,但強力腳本編寫實際上只需要名稱、消息和一些腳本索引搜索。
命名事物
讓我們從命名事物開始。 您可以通過為 JMP 命名一個名稱,並在其後面加上等號,然後編寫您希望該名稱代表的文本、數字、代碼等來命名事物。 這個名字叫做多變的。 您可以將變量視為可以放入內容的容器,或者將其視為打開報表的暱稱聯合管理計劃。
讓我們看一個使用方差分析的示例。 要創建 ANOVA 代碼,請首先在“Fit Y by X”(在“分析”下)中運行分析,然後打開 ANOVA 測試,然後將代碼保存到腳本窗口中。 以下是使用 Big Class Families.jmp 的報告以及從紅色小三角菜單中保存的生成的 JSL 代碼(身高為 Y,性別為 X,然後選擇均值/方差分析/合併 t在紅色三角形下):


這個小 JSL 片段將為任何與原始數據表具有相同列名的數據表生成方差分析。 (不過,在本系列中我們不會擔心參數化。 有點超出範圍了。)
現在,如果您打開了一堆數據表並且想要控制要在哪個數據表上運行方差分析,該怎麼辦? 那麼,您可以通過為要運行方差分析的數據表指定名稱來編輯腳本,然後將 JMP 生成的代碼作為消息發送。 如果您要查看腳本索引(請參閱有關獲取幫助的文章),您會找到幾種方法來執行此操作。 您可以直接調用數據表,也可以使用 Current Data Table() 獲取對 JMP 當前關注的數據表的引用。 第三個選項稍微高級一些,您可以在打開數據表時為其指定名稱。 我在下面列出了所有三個示例(並再次注意使用註釋來傳達信息!):

只要打開的數據表具有您嘗試使用的名稱,就可以按名稱調用數據表。 如果您有要使用的數據表名稱列表,這會很方便。 如果您隱藏或最小化了數據表,它也會很方便。 在任何一種情況下,即使您不一定能看到它,您仍然可以將消息發送到數據表。 該方法使用以下形式:
<變量名> = 數據表(“<數據表名>”);
就我們的目的而言,將變量分配給數據表的最有用方法可能是使用 Current Data Table () 函數。 此函數獲取活動或當前數據表的任何內容,並將其分配給您指定的變量。 將表分配給變量後,另一個數據表是否成為“當前”數據表並不重要(例如,通過創建匯總表,您將始終擁有對第一個數據表的引用,直到重新定義變量為止)。 它有一個更簡單的形式:
<變量名> = 當前數據表();
如果您想假設有人運行腳本時數據表可能未打開,則最後一種方法很有用。 通過使用此方法,JMP 將生成一個文件對話框,允許用戶選擇要打開的文件。 當用戶確認他們的選擇時,文件將被打開並分配您指定的變量名稱。 同樣,這是一個簡單的形式:
<變量名> = Open();
使用打開(…);如果您習慣使用文件路徑和目錄,該方法也會很方便。 您可以將文件路徑放在括號內,以告訴 JMP 在哪裡查找文件,如下所示:

另外,請注意,我正在使用一種稱為路徑變量在裡面打開(…);命令來縮短字符串。 中有一個關於它們的部分腳本指南。
發送消息
現在,一旦您命名了某個內容,就可以向其發送消息。 它的工作原理類似於通過手機向某人發送短信。 當您發送短信時,您首先需要知道收件人的姓名、電子郵件地址或電話號碼,以便識別他們的身份。 您將其輸入消息應用程序,然後發送消息。 以下是使用大類方差分析的方法。 在這種情況下,我將享受一些樂趣並讓 JMP 要求我打開一個文件:

讓我們從第 5 行開始解壓我們在這裡看到的內容。 我們首先看到的是我們想要給出指令的數據表的變量名稱。 就像我們向某人發送短信或發出指令一樣,我們必須確定我們正在與誰交談。 接下來是兩個“小於”符號(<<)。 我們已經在 Glue Operator (;) 中看到過類似的情況。 “<<”符號稱為消息運算符。 它讓消息接收者知道接下來是一條消息。 之後,我們看到一個名為 Oneway(...) 的函數;以及函數創建方差分析報告所需的參數。 注意:您可以在文檔或腳本索引中獲取有關該函數的選項的所有信息,但實際上不必手寫任何內容。 只需運行一次分析並使用其中之一獲取完成的腳本(帶有所有選項)將腳本保存到...我之前向您展示過的命令。
一些零碎的事情
好的,最後三個細節需要解決。 首先是把事情串聯起來的問題。 例如,如果您想在同一腳本中執行方差分析並創建圖形生成器,則需要警告 JMP 需要遵循進一步的說明。 為此,請使用我一直提到的粘合操作符 (;)。

就像書面英語中的分號一樣,命令末尾的分號讓 JMP 知道還有更多指令即將到來。 膠水位於 Bivariate(...) 等指令的末尾。 ; ,或分佈(...) ; ,或給某物命名:stuff = 5 + 6 ; 。 您可能還記得之前的帖子,當我們使用 JMP 時,JMP 會自動包含分號保存腳本...到腳本窗口,但是在徒手編寫腳本時,這恰好是我在編寫腳本期間犯下的最常見錯誤 - 忘記將事物粘合在一起。
第二個細節是確保您的腳本在 JMP 會話中是良好的公民。 這是通過將您創建的所有變量分配給名稱空間。 命名空間是一個小沙箱,可以防止您創建的變量名稱干擾軟件的其他部分。 默認命名空間稱為“Here”命名空間。 在腳本中,它看起來像這樣(參見第 2 行):

該指令應始終位於腳本的開頭(直到您了解何時不使用它!),以防止變量名稱與其他腳本或 JMP 的部分發生衝突。 在你開始討論這一點之前,請先看一下我剛才所說的 TL;DR 版本:只要記住始終將“Names Default To Here(1);”放在前面即可。在腳本的開頭,暫時就可以了。 如果您想了解有關命名空間的更多信息,請參閱有關該主題的段落我不久前寫的另一篇文章。
我需要討論的最後一個細節是如何更改已保存腳本中的列名稱。 這真的很簡單。 查看您保存的腳本。 您應該會看到列名稱前面有一個冒號(“:”)。 該冒號表示它們是列名稱(它可以表示其他含義,但目前,它表示列名稱)。 要更改列名,只需更改它即可,但請記住將冒號放在前面。 如果您的列名稱包含特殊字符,則當 JMP 為您輸出腳本時,您可能會遇到類似 :Name(“...”) 的情況。 這就是 JMP 處理列名中包含的字符的方式,如果不清楚這些字符是否是字符串的一部分,則會導致問題。 儘管在我們的腳本中使用 :Name(“...”) 是一種不好的編碼形式,但軟件會使用它,因為它沒有選擇。 您應該嘗試選擇更好的列名稱。
但你忘了...
好吧,我意識到你們中的一些人此時可能會有點緊張。 您可能會想,“您忘記了函數!!!”或者“但是表達呢!!!”甚至,“你這個混蛋!!! 你完全忽視了邏輯和循環!”首先,直呼其名並不好。 其次,我沒有忘記任何一件事。 我有意識地省略了它。
問題是,這個系列並不是為了讓你把頭髮吹到後面。 就像我在本系列開始時所說的那樣,它的目的是為您指明正確的道路,為您提供一張好地圖,一些零食,鼓勵您,並告訴您在遇到困難時到哪裡尋求幫助。 這是一個起點。 (順便說一句,你現在已經得到我的允許吃點零食了。)
對於我們這些經常編寫腳本的人來說,我在這裡談論的很多內容都是非常基礎的,非常基礎的,以至於它是肌肉記憶。 我們忘記的是,僅通過使用我在這裡介紹的基礎知識,新手腳本編寫人員就可以涵蓋很多內容。 不管怎樣,如果你因為我沒有介紹任何超級花哨的東西而感到呼吸過度,放鬆一下。 我們將在下一個系列中深入兔子洞。 現在,讓我們回到討論上來,談談本週的作業。
家庭作業
好吧——我們到了。 大作業練習。 本週,您將把上週編寫的代碼片段粘合在一起。 一次一點地執行此操作。 如果您的腳本將位於數據表之外(作為 JSL 文件),那麼首先打開數據表並將其放入變量中。 之後,無論您的腳本將存放在哪裡,都可以添加一些內容並檢查它是否符合您的預期。 然後添加更多並再次檢查是否獲得預期結果。 請記住,社區、幫助文件等都是您的朋友。 如果收到錯誤消息,請查看日誌(查看 > 日誌對於個人電腦和窗口 > 日誌對於 MacOS)和上一集。
祝你好運,下週見!