| 揚聲器 |
文字稿 |
| 喬丹希勒 |
大家好,我是 Jordan Hiller,本次演講的主題是「竊取程式碼!從增強日誌中取得腳本的三種升級」。 |
| |
這就是我這次演講的靈感來源。它出自艾比·霍夫曼(Abbie Hoffman)之手,他是一位頗具爭議的行動主義者。沒錯,他把這本書命名為《偷這本書》(Steal this Book),這名字真是絕妙。雖然我不確定這算不算一個好的商業計劃,但無論如何,它確實很吸引人。 |
| |
那麼,為什麼要竊取這段程式碼呢? JMP 就是想讓你竊取程式碼。其理念是讓你只需點擊幾下滑鼠,就能在 JMP 中進行分析。 |
| |
你點擊操作背後的程式碼會被儲存下來。它會保存在增強型日誌中,你可以取得並重複使用它。 |
| |
這大約佔你生產腳本的 90%。你要提取並重複使用這部分內容,以便你可以… |
| |
將常見任務自動化,只需單擊一個按鈕即可完成,而無需進行一系列點擊操作。這就是我們的最終目標,您將節省時間。 |
| |
從增強型日誌中提取的腳本就是生產腳本的骨架。 |
| |
大約還有10%的內容需要你自己寫,這也是我們這次演講的目標。我們將探討一些將劇本串連起來的要素。 |
| |
所以這次演講,我將重點放在文法細節上,而不是文法的具體細節。 |
| |
更注重整體框架,我認為這才是學習 JSL 程式設計的好方法。最好是直接使用現有的程式碼,透過範例來學習。好好利用這些代碼。 |
| |
找到能實現你想要的功能的程式碼片段。你可以在 JMP 使用者社群或腳本編寫指南中找到它。 |
| |
直接複製貼上,然後根據自己的需求進行修改即可。你不需要了解所有複雜的語法。這樣你就能很快上手。隨著經驗的積累,語法自然而然就會掌握。 |
| |
接下來我們將討論三個案例研究,探討如何利用增強型日誌來改進程式碼,但首先讓我們回顧一下 JSL。這對某些讀者來說,或許可以作為 JSL 基礎知識的入門介紹。 |
| |
所以,如果你是 JSL 的初學者,你需要了解的最重要的一點是:一切皆對象。你所做的每一件事都是對象。 |
| |
想要對物件執行某些操作,該物件包括資料表和資料表中的列,以及平台,例如分發平台、圖形建構器、「Y 對 X 擬合」等。 |
| |
以及這些平台的報告。所以,當你有物件時,你操作它們的方式是向它們發送訊息。對像也會接收訊息。這裡有一個我從增強日誌中複製的非常簡單的範例。 |
| |
開啟範例資料目錄中的「Big Class」資料表,執行一個簡單的分佈分析,對吧?這就是從日誌複製的程式碼。 |
| |
現在。 |
| |
我們首先要做的是為資料表命名。給它一個名字,為此我使用了這裡第五行的程式碼並對其進行了改進。 |
| |
在語句的其餘部分之前,也就是在開啟資料表之前,新增了 `bctable=`。這樣做的作用是,當我們開啟資料表時,會建立一個名為 `bctable` 的名稱。你知道,我選擇了 `bctable`,你會在文件中看到 `dt`。你可以使用任何你想要的名稱,這是由你指定的。 |
| |
所以,我們選中它,點擊運行按鈕,打開 Big Class,同時將名稱賦值為 bctable。這樣做的好處,或者說為什麼它很重要,是因為現在我有了這個。 |
| |
處理。這是一個鉤子,我稍後可以在程式碼中使用,bctable。每當我提到bctable時,我指的是Big Class。 |
| |
所以 |
| |
這是下一行,但是分發命令,我也修改了它。你知道,之前從日誌來看,這是一個裸分指令。它沒有… |
| |
它並沒有指向任何數據表。這樣運行的話,JMP 只會對目前獲得焦點的資料表執行操作。 |
| |
目前數據表恰好是一個大類,因為你剛才打開了它,好的。但最好還是明確一點。最好明確指定要操作的資料表,所以我們就這樣運行。 |
| |
bctable,然後是雙箭頭,再然後是分佈指令。所以我們加的就是雙箭頭的bctable。 |
| |
這就是發送訊息的語法。所以我們將右邊的分發訊息傳送到左邊的資料表,也就是名為 bctable 的資料表。當我將滑鼠懸停在 bctable 上時,可以看到它顯示的是 Big Class。所以運行整個過程, |
| |
我們獲得了分銷報告 |
| |
正是我們想要的。 |
| |
現在,我們可以更進一步,而且通常情況下,我們也需要這樣做。我們將在運行平台的過程中為其建立一個名稱。 |
| |
這裡有一行程式碼同時包含了雙箭頭和等號,好的。那麼,我們……我們從右往左讀。我們將把這條分發訊息發送到 bctable。 |
| |
而這一切的結果,也就是平台,我們將保存在這個我稱為 distplat 的變數中。 |
| |
我們來運行一下。 |
| |
好的,看起來一樣,但區別在於我現在有了這個 JSL 變數 distplat,我可以在後面的程式碼中使用它。 |
| |
你會用它做什麼?你可以用它來為輸出添加紅色三角形選項,那麼我們來試試看… |
| |
我們把那份分銷報告放到你能看到的地方。 |
| |
我們將使用 distplat 對象,那就是…那就是分發平台。 |
| |
你看,把滑鼠懸停在上面,我們運行一下這行程式碼。在分佈平台上啟用常態五分點陣圖。看到了。 |
| |
好的。 |
| |
最後一步是拿起平台,把這個物體放在這裡,然後… |
| |
從中取得一份報告,也就是一個報告對象。就是這一行程式碼。將報告訊息傳送到平台對象,現在我們就得到了一個報告對象。 |
| |
如果您想在程式碼中存取這些值——報告中的任何數字、圖表或圖形元素——您都需要這個物件 rdistplat。所以再運行一次,rdistplat。 |
| |
我運行了程序,雖然表面上看不到任何結果,但現在我得到了一個名為 rdistplat 的物件。它顯示這是一個顯示框,稍後我們將討論如何使用它來存取報告中的數字。 |
| |
好的,我要清除我的日誌。 |
| |
首先,我們從我們開始。 |
| |
案例研究。 |
| |
所以我們要學習的第一個技巧是,使用 for each 指令透過循環遍歷資料表中的不同列,對資料表的不同列重複執行相同的指令。 |
| |
這是一個非常常見的需求,有時只需要做一些簡單的事情,例如更改列的格式或建模類型。 |
| |
它可能非常複雜,例如 |
| |
對列進行轉換,運行控製圖,然後利用該控製圖進行一些操作。所以,是的,這種方法具有可擴展性。 |
| |
以下是如何在 JSL 程式碼中實現此功能的方法。首先,我們透過點擊操作來完成我們想要的操作。先對單列進行操作,然後使用增強型日誌取得該程式碼。 |
| |
這就是我們腳本的框架。接下來我們將對其進行修改,以便遍歷所有需要執行該操作的列。 |
| |
我們將使用的 for 迴圈、迭代方法是 for each,這是 JMP 16 中引入的,因此該技術在早期版本的 JMP 中不起作用。 |
| |
這裡也用到了 JSL 清單的概念,所以我們也會稍微談談這個概念。 |
| |
好的,我要開始了。 |
| |
在 JMP 中,讓我從主視窗開始。 |
| |
我要……讓我先檢查一下日誌,確保它乾淨。不,我得先刪除一個東西,清除日誌。好的,我們來點選選擇要執行的操作。我要開啟一個名為 sc20 的資料表。 |
| |
您可以在網路上找到的示範資料中找到此資料表。 |
| |
查看這個資料表,它有一個 ID 列,然後大約有 20 個資料。 |
| |
資料列有很多小數位,精度太高,我想截斷到小數點後兩位。所以我們來更改格式,只顯示資料的前兩位小數。 |
| |
這是一個簡單的點擊操作。右鍵單擊,進入列訊息, |
| |
我們將把預設的顯示格式改為保留兩位小數的固定小數格式。 |
| |
好的,現在我們已經完成了 NPN1 欄位的操作,我們還有其他 19 個欄位也想進行相同的操作。 |
| |
那我們就來看一下增強後的日誌。 |
| |
這就是我們需要的程式碼,它能幫我們更改 NPN1 欄位的格式。若要再次使用這段程式碼,請點擊紅色三角形,您可以將腳本儲存到剪貼簿或新的腳本視窗中。 |
| |
我要切換到另一個文件,我在那裡做了一些工作,這樣我們就可以更深入地研究一下了。 |
| |
好的。 |
| |
所以這裡的前兩行…三行,是日誌中的程式碼。好的,我們首先要做的是開啟資料表。 |
| |
您可能已經注意到我做了一些修改,我刪掉了這個檔案的長路徑名和長目錄路徑。 |
| |
如果你這樣運行, |
| |
只要 JMP 資料表 sc20 與此 JSL 檔案位於同一目錄下,它就能正常運作。所以,這就好比是你目前所在目錄的本機檔案路徑。 |
| |
總之,從日誌中我們打開了資料表,然後我們在這裡應用格式更改,固定十進制 10 個字符,兩位小數。 |
| |
表格…左側的列引用是訪問列的一種方式。還有幾種不同的方式,但這是最常見的一種,你會經常看到它使用冒號。冒號左側是表格引用,右側是列名。 |
| |
這是直接摘自日誌的內容。 |
| |
JMP 在日誌中以這種方式存取資料表。我認為最好還是按照我們討論的方式,在開啟資料表時直接給出 JSL 名稱,然後以後都使用這個 JSL 名稱。所以,我把冒號前的那些內容改成了 dt。 |
| |
所以,這是同樣的程式碼,只是稍微修改了一下,當我運行它時,是的,它產生了正確的效果。它打開了數據表,然後… |
| |
將格式變更為兩位小數。好的,現在我們有了這一點,這很容易做到… |
| |
對,把其他19列都改一下。好了……這是NPN1,然後我就可以複製這一行,把所有列都改了,再重複寫19遍。 |
| |
當然,那樣效率很低。程式設計的一大優點就是…你不需要重複做同一件事,對吧?所以如果我們只寫一次,而不是寫19次、20次,維護就容易多了。 |
| |
具體做法如下。首先,我們要取得所有需要進行操作的列的清單。 |
| |
我說的列表,不是指一般的列表。我指的是 JSL 列表,也就是你在 JSL 程式設計時所使用的特定資料結構。 |
| |
列表是將幾個物件放在容器中,這就是它的用法。以下是建立列物件清單的三種方法。 |
| |
第一種方法是手動操作,也就是把所有內容都輸入進去。所以如果我運行這個程序, |
| |
三個表格引用……三個欄位引用,NPN1、PNP1、PNP2。 |
| |
注意我的程式碼中以及滑鼠懸停在 CNames 變數上時出現的花括號。當你看到這些花括號時,就知道你正在使用 JSL 處理清單。 |
| |
好的,這是獲取清單的一種方法。我們再來討論其他幾種方法。最終,我們將在本例中使用這種方法。 |
| |
意思是,嘿,獲取我當前資料表(我在這裡命名為 dt 的資料表)中的所有連續列。所以訊息對象,建立一個新列表。 |
| |
那麼,我們來運行一下這個程式。 |
| |
現在,如果我將滑鼠懸停在 CNAME 上,您就會看到這就是我們想要的。這是我們想要操作的全部 20 個 CNAME 的清單。 |
| |
好的,最後一種方法是讓使用者選擇資料表中的列。就像這樣。我這裡只選兩列。我們選擇 IVP 和 PNP4,兩列都選中了。 |
| |
如果我運行這個程序, |
| |
我們從資料表中得到一個只包含這兩個選定列的清單。 |
| |
好的,無論你如何得到這個列表,下一步就是將該格式行應用於列表中的每個項目,這叫做循環或迭代。 |
| |
所以,這是以前的方法。它使用 JMP 中的 for 命令。這是 JMP 16 之前的版本所使用的方法,我把它放在這裡,以防你還在使用 JMP 15。但是, |
| |
你知道,對於新用戶來說,查找列表有點複雜且令人望而卻步,所以如果你在 JMP 16 中使用列表,你可以使用一種更簡潔易讀的方法。如果我想對清單中的每個元素重複執行某個操作,我可以為每個命令使用這個方法。 |
| |
好的,讓我們來看看它到底在做什麼。它接受三個參數,參數之間用逗號分隔,我們從右到左依序處理。 |
| |
最後一個參數是格式化命令,對吧,應用格式,但是我沒有對 dt NPN1 執行此操作,也沒有對一列執行此操作,而是在這裡放置了一個佔位符並選擇了列表項;您可以選擇您想要的內容。 |
| |
好的,這只是一個詞,一個變數名,你可以自己選擇。我選擇了清單項目。所以這是我們的佔位符,這是我們想要對清單中的每個項目運行的命令。哪個列表?就是這個列表,好的。這就是我們的列表,這是第二個列表。 |
| |
參數。然後第一個參數是佔位符,對吧。它告訴我們,我們將使用該佔位符來保存清單中元素的值。 |
| |
它放在花括號裡,所以如果你要重複使用這段程式碼,一定要使用花括號。 |
| |
所以整個過程就是這樣,原本需要20多行程式碼,現在只需要三行程式碼,其中就包含開啟資料表的程式碼。 |
| |
取得列名列表,然後重複此動作…對所有 20 個連續列重複此操作。要運行整個過程,您可以看到它的樣子。 |
| |
就是這樣。現在,每一列都是這樣。 |
| |
以該格式顯示兩位小數。 |
| |
好的,剛才這個例子很簡單,展示瞭如何使用 for each 來做一些非常簡單的事情。 |
| |
在一根柱子上。 |
| |
我舉一個稍微有趣的例子給你聽。 |
| |
以下是一個範例,對於同一資料集,對於 sc20, |
| |
我打算為每一列都做一個控製圖,然後把這些控製圖加到日誌裡,最後把整個日誌保存成PDF文件,好嗎? |
| |
它對每個元素都使用相同的代碼,前兩個參數也相同,第一個參數是列表項,第二個參數是列表名稱。但現在我的第三個元素(也就是列表項)有很多程式碼…作為每個元素的第三個參數。 |
| |
好了,開始吧。讓我們運行整個腳本。 |
| |
打開程序,執行一堆控製圖,然後把它們整理到日誌裡。現在,如果我看一下我的桌面,就會看到我創建了一個文件,叫做 report.pdf,裡麵包含了所有這些控製圖,第一頁,以及用來分隔它們的分頁符。所以是第一頁、第二頁、第三頁。 |
| |
所以您也可以在空閒時間查看這個範例。它包含在演示材料中。 |
| |
好的,這就是我們要講的第一種方法。接下來,我們清除日誌,準備講解下一個方法。 |
| |
好的,從報告中提取一個值。這在 JSL 中很常見。當你進行某種分析時,例如分佈分析或迴歸分析,你需要… |
| |
從中獲取一些東西,收集一些東西。也許是平均數或中位數。也許是迴歸的斜率係數或P值。 |
| |
這就是我們的工作,而棘手之處在於,報告具有層級分明、嵌套很深的結構,要沿著這個層級向下查找,找到我們想要的內容,可能會有點棘手。所以我今天要教你們一個技巧。 |
| |
訣竅在於,我們將像往常一樣透過點擊操作來完成分析,然後選擇我們想要獲得的內容。 |
| |
我打算把文字顏色改成紅色,只是稍微改動一下格式。然後,當我們把腳本儲存到日誌裡時,我們會用它來了解如何處理那個紅色的項目。 |
| |
在JSL中。那麼,我們一起來看看吧。 |
| |
又回到JMP了。 |
| |
我要開 Big Class,就是那個老牌的 Big Class,然後我們對身高列進行分佈分析。 |
| |
好的,這是我的分佈報告,我想從中提取一些東西。假設是中位數,在這個例子中中位數是 63,我要把它放到一個 JSL 變數裡,這樣以後就可以重複使用它,例如用來寫程式碼、做一些數學運算之類的。 |
| |
想知道如何解決數字 63 的問題,這裡有個訣竅。 |
| |
我想更改這個我想抓取的東西的顏色、字體或其他任何屬性。如果你以前從未見過這種操作方法,那麼了解一下就很有必要。 |
| |
工具列上有一個屬性按鈕,我相信這是 JMP 16 中的一個新按鈕。 |
| |
所以,如果您啟用此報告的屬性。 |
| |
我們可以順著這棵樹往下找,找到我們需要的東西。所以,看看這個。 |
| |
右側是數字列框。請注意,當我點擊報告的不同部分時,相應的列也會隨之變化。 |
| |
在屬性面板中會反白顯示該項目及其所屬的顯示框類型。 |
| |
好的,我們可以看到,這個包含所有這些結果的框是一個數字列框,裡面有很多數字,就像我告訴過你們的,我們要把這個框的文字顏色改成紅色。 |
| |
就這樣。 |
| |
現在我要關閉屬性面板了。 |
| |
報告已生成,讓我們將此腳本傳送到增強型日誌中。 |
| |
紅色三角形,將腳本儲存到日誌中。 |
| |
現在正在查看日誌。 |
| |
這就是我們想要的部分。它包含分佈命令,可以將中位數和其他統計資料的文字顏色變更為紅色。現在讓我們更詳細地看一下。 |
| |
好的,這就是那段程式碼…和增強日誌裡的程式碼一樣。我把它複製過來,稍微格式化了一下,這樣我們就可以更詳細地討論我們需要什麼了。 |
| |
所以我們這麼做的全部原因就是為了得到這部分,我們現在要解讀它,好嗎?它使用了發送報告功能,並在其中使用了調度功能。 |
| |
接下來我們要專注在 dispatch 的四個參數。我們需要前三個,第四個參數是改變顏色,但這不是我們真正關心的。我們關心的是顯示框,也就是我們想要的元素,好嗎? |
| |
第一個參數是導航。它告訴我們,向下滾動到顯示框,這些實際上是輪廓框,向下滾動到輪廓框。 |
| |
好了,我們來看這份報告。我相信您已經注意到,在 JMP 中,報告有多層嵌套,對吧?我這裡只有… |
| |
一個外輪廓框分佈。其中包含輪廓框高度,輪廓框高度內又包含輪廓框分位數,而分位數內則包含我需要擷取的內容。 |
| |
這就是它告訴我的。它告訴我沿著那棵樹往下走。我只要它的高度和分位數,就能幫我們找到它了。 |
| |
很好。接下來的兩個參數告訴我們一些關於這個元素的資訊…這個我們正在嘗試的元素,也就是我們標記為紅色的那個元素。第三個參數告訴我們它是什麼,它是一個數字列框,我們在屬性中看到了這一點。 |
| |
第二個論點告訴我們標題是什麼。 |
| |
這個數字列框是空白的。這個沒有標題,沒關係。我們仍然可以利用這些資訊來獲取數據,所以有時你會看到標題,有時則不會。 |
| |
好了,現在我們有了這些訊息,我們將利用這些資訊。 |
| |
提取中位數。 |
| |
以下是實現該功能的程式碼。它從第 23 行開始,一直到第 29 行。 |
| |
我們再次打開數據表。 |
| |
命名分佈,執行連續分佈。 |
| |
你會注意到我們沒有任何調度和發送報告的操作,那是因為我們的生產腳本中不需要將其變為紅色。 |
| |
所以,進行分佈分析,並確定平台名稱。 |
| |
這很重要,你必須…你正在存取報表層。你用這行程式碼提取它,所以它創建了 rdist,也就是這個報表物件。 |
| |
然後,奇蹟就發生在這一行。我們就是在這裡抓住它。 |
| |
我們會把中位數賦值給 JSL 變數 mdn,然後把它寫入日誌。接下來我會再詳細解釋一下,但首先我們先運行一次,看看它的作用。 |
| |
我本來要運行第 23 行,哎呀,我們換個方式吧。我們運行……第 23 行到第 29 行。 |
| |
已完成分佈計算。分佈圖不是紅色的,我們提取了中位數,現在儲存在 mdn 中,可以看到該變數的值為 63。 |
| |
中位數是 63。完美。 |
| |
好吧。 |
| |
所以,這裡就是我們提取資料的那一行。 |
| |
報告中的中位數是 63。 |
| |
我們來看看。我這就把它調出來,這樣我們就可以… |
| |
就像我們做這件事一樣,可以參考這一點。 |
| |
所以,這就是那一行。它只是再次進行了整理,以便我們可以分別查看每個元素。 |
| |
報告中的中位數是 63。 |
| |
我們是這樣實現的。 |
| |
這叫做下標……下標化。當你在 JSL 程式碼中看到方括號時,這表示你正在對一個物件進行下標化。這個物件是某種容器,例如顯示框、 |
| |
通常是一個列表。你也可以用這種方式為清單加上下標。所以我們現在做的,是的,我們正在提取這個報表物件中的巢狀項目。 |
| |
首先我們要看到的是高度輪廓框。記住這一點,然後我們要向下看到分位數框,也記住這一點。 |
| |
現在我們找對地方了。我們只需要找到我們想要的東西,我們想要的是數字列框,對吧?因為它之前沒有… |
| |
我們本來可以用標題(這裡沒有標題),但現在我們用數字來指稱它。它是分位數輪廓框中的第一個數字列。 |
| |
所以你可能會看著這個,然後想,等等,這邊有數字。那也是一個數字列框,對吧?不,實際上不是。它是一個字串列框。記住,如果你想的話,你可以檢查所有這些設定。這些都來自屬性設定。 |
| |
如果我點擊這裡, |
| |
數字列框、字串列框、字串列框。看到這裡了嗎?字串……字串數字,所以這是第一個數字列框。 |
| |
這樣就能取得所有這些數字了。 |
| |
好的,最後一步是添加下標。這樣加入下標的意思是:取得第六個元素……1、2、3、4、5、6。這就是中位數,是 63。執行這行程式碼後,它會為報表加上下標,並提取出中位數,以便我們之後可以重複使用。 |
| |
所以,以上就是如何從報告中提取資訊的方法。我還有另一個例子,會在簡報資料中分享。 |
| |
如果遇到這種情況,你可以使用帶有標題的元素作為模板來進行自己的工作。 |
| |
好的,我們最後要討論的是如何從使用者(即運行腳本的人)那裡獲取輸入。 |
| |
讓他們選擇要分析的文件,甚至是分析資料表中的哪一列。這或許是最常見的做法。 |
| |
這是初級腳本編寫者想要做的事情。你知道,我已經寫好了一個腳本來處理某一列,現在我想把這個功能分享給組織裡的其他人。 |
| |
讓他們自己用不同的數據來操作,對吧。所以,如果你…如果你以這種方式概括你的腳本,讓使用者選擇檔案或列,或者兩者都選擇, |
| |
你正在對腳本進行通用化處理,這大大提升了它的價值。你可以把它分享給組織裡的其他人。他們可以複製你的工作,而且無需點擊那麼多按鈕就能快速完成。 |
| |
好的,這一部分與其說是個案研究,不如說是一份清單。我們將…我將向您展示三種讓使用者選擇檔案的方法,以及兩種讓使用者選擇列的方法。 |
| |
我們先從選擇文件的方法開始。像往常一樣,我們先在日誌中執行一些操作,然後複製日誌內容。這是…這是開啟 Big Class 時的樣子,你會在日誌中看到這些內容,開啟 Big Class。 |
| |
我這裡用的是 dt,所以當我打開 Big Class 時, |
| |
現在它已經……dt 指向了大班,好的。然後我會繼續我的製作腳本,對吧。 |
| |
關鍵在於,要讓使用者選擇他們想要的文件,我們只需要找到一種方法讓 dt 指向其他東西。 |
| |
寫完腳本的其餘部分,使用 dt,然後在開頭,你可以修改這一點。 dt 不再只是指向 Big Class;它將指向其他東西。 |
| |
好的,還有一點是由使用者決定的。 |
| |
運行腳本的人。好的,我認為最簡單的做法是…你可以使用這行程式碼來代替開啟資料表。如果你在腳本開頭使用這行程式碼來賦值 dt, |
| |
這意味著 JMP 將運行此腳本並給出該 dt。 |
| |
將名稱設為前面的資料表的名稱。 |
| |
所以從使用者的角度來看,他們所做的就是開啟一個資料表,我這裡要開啟 sc20,然後建立 sc20。 |
| |
這是我目前的數據表。看到上面這個了嗎?這個視窗裡顯示的就是目前的資料表。 |
| |
因此,如果您的使用者開啟資料表,然後執行腳本,然後遇到這一行,則 dt 現在將指向 sc20。 |
| |
所以這確實是一個很強大的方法。但它的問題在於…它要求用戶非常清楚該怎麼做。他們必須知道首先要打開資料文件,然後再運行腳本。 |
| |
我們可以做一些更完善的事情。我們可以在他們運行腳本時顯示一個檔案選擇器,這樣他們就可以瀏覽目錄結構並找到要開啟的正確檔案。 |
| |
事實證明,這非常簡單。你只需要刪除這裡所有內容,刪除對 Big Class 的引用,然後直接使用 open 語句,無需任何參數。 |
| |
當 JSL 嘗試…當 JMP 嘗試解析這行程式碼時,它會說,好的,用戶想要打開某個文件,但我不知道是什麼…完全不知道是什麼。讓我們顯示一個文件選擇器,讓他們自己選擇。 |
| |
那麼,讓我們……讓我們來運行一下。 dt = open。 |
| |
運行腳本。這是通用的檔案選擇器,我將從我的桌面開啟 Iris 檔案。 |
| |
Iris 是開放的,當然,它有 dt 名稱。 |
| |
所有JMP文件,所有文件,對吧。這裡可能顯示了很多東西。 |
| |
所以,如果你需要更多控制權,哦,如果你需要更多控制權 |
| |
使用者將要做出的選擇,我們將不使用“開啟”,而是使用“選擇檔案”。 |
| |
“選擇檔案”指令有幾個不同的選項。我只用了其中的三個。 |
| |
我們來看這個例子。選擇檔案指令的前三個參數是你在選擇視窗中看到的檔案標題, |
| |
選擇器將啟動的目錄,以及一個過濾器,用於告訴你可以透過該選擇器開啟哪些文件,對吧。那我們來運行這段程式碼…這行程式碼,這部分程式碼,選擇檔案指令,並將結果儲存到 PF 中。 |
| |
運行它。 |
| |
好的,請注意這裡顯示的是「選擇Excel檔案」這個選項。這就是我們在視窗標題中看到的內容。 |
| |
資料夾,也就是第二個參數中的路徑,就是它的起始位置。 |
| |
第三部分,也就是文件篩選器,它設定只顯示使用者可開啟的 Excel 文件,就在這裡。我不能更改設置,只能打開 Excel 文件。 |
| |
比如說三明治,然後點選打開。 |
| |
等等,為什麼沒打開? |
| |
好,我們來檢查一下。 PF 代表 pick file(選擇檔案)。 PF 是什麼呢?哦,PF 是我們想要打開的文件的路徑。我們還沒有發出 open 指令。 Pick file 不會開啟文件,它只會選擇一個文件。 |
| |
為了完成整個流程,我們需要這樣做:開啟文件建立表引用。 |
| |
PF 變量,指向我們想要的文件,也就是我們想要的 Excel 文件。 |
| |
好了。這樣就打開了三明治數據表,現在我有了數據表,可以繼續運行我的腳本了,正如我所願。 |
| |
讓我在這裡停一下,為你展示一些重要的東西。選擇文件,如果你遇到類似的情況,並且不了解所有的參數,想要了解更多,有幾點需要注意。首先,你會得到一些… |
| |
滑鼠懸停幫助會彈出一個小窗口,顯示一些語法資訊。這裡有個更好的方法。在腳本視窗中右鍵單擊它, |
| |
你可以在腳本索引中找到它。腳本索引對於任何JSL程式設計師來說都是一個非常重要的工具。 |
| |
它包含了你要找的命令。它列出了參數,提供了一些解釋性文字,更重要的是,它還提供了幾個範例,你可以運行這些範例來了解它的功能。所以,如果我運行這個範例,它會產生一個 pick 檔案。 |
| |
它把我送到了一個我不想去的地方。 |
| |
我們就把它關掉吧。 |
| |
沒錯,然後我們就可以做實驗,取得這段程式碼,竊取這段程式碼,並在我們的腳本中使用它(如果我們願意的話)。 |
| |
好了,這就是腳本索引。它也可以從幫助選單中找到。腳本選單…在那裡查找相關資訊。 |
| |
目前資料表、裸開啟或選擇檔案。還有其他方法,但這三種是很好的入門方法。 |
| |
現在我們來談談如何讓使用者選擇他們想要操作的列。 |
| |
我在這裡……我從日誌中複製了一些內容。我打開了一個名為“價格”的數據表,並在上面繪製了一個圖表,顯示蘋果價格隨時間的變化。 |
| |
我不會示範點擊操作部分,直接執行腳本。我想你已經知道如何從增強日誌中提取腳本了,所以讓我們來看看腳本的功能。它會打開價格頁面,然後顯示我的圖表:蘋果數量隨日期變化,蘋果價格隨時間變化。 |
| |
所以你看這個數據表,價格,沒錯,這裡有蘋果,但我也把其他這些東西都列進去了,對吧。那麼,如果我想讓使用者告訴我他們想看什麼圖表,想看哪一列的圖表呢? |
| |
本節內容是關於如何讓使用者做出選擇。 |
| |
好的。 |
| |
所以我們將討論兩種方法。這是第一種方法。 |
| |
它是在對使用者選擇的列進行操作。 |
| |
而我們之前也看過這種文法,我想,在我們的第二個案例研究中。是的,這就是我們創建清單的方式。 |
| |
它包含了資料表中選定的列。現在讓我回到那個數據表。 |
| |
我打算選擇,大概三列, |
| |
我們跑吧 |
| |
沒錯。實際上,我覺得我應該運行dt。我們把這兩個都運行一下吧。 |
| |
雞肉、咖啡和雞蛋。 |
| |
好的。 |
| |
所以。 |
| |
我要對哪個元素進行操作?你知道如何操作,如何用循環遍歷列表,但我們今天不這麼做。我打算用個簡單方法。我來說說, |
| |
如果使用者選擇了多個選項,我只繪製他們選擇的第一個選項的圖表。例如,在運行腳本之前,用戶選擇了雞肉、咖啡和雞蛋。我只想給他們顯示雞肉的圖表。 |
| |
好的,這就是下一行。這裡是下標。我們對 CNames 清單使用下標,以取得第一個元素。 |
| |
所以我們會運行這個程式。 |
| |
現在我有了這個不錯的變量,我的 col, |
| |
清單中的第一個項目是“雞肉”,列引用以冒號開頭。 |
| |
現在我們可以運行圖表產生器了。現在我們可以繼續我們的生活了,唯一的區別是我們把上面原本是蘋果的地方替換成了其他東西。 |
| |
現在這就是我的列。這是我們做的唯一改動,所以運行這個程序,我們將得到雞肉價格的圖表。 |
| |
好的。 |
| |
好的,這是一種方法,但是,就像我們之前討論的那樣,這需要用戶知道自己該做什麼。這需要… |
| |
這種方法要求使用者必須先開啟數據表,選擇相應數據,然後執行腳本,這有點麻煩。 |
| |
相反,在執行時向使用者顯示列選擇對話方塊會更穩健一些。它的樣子如下。文法有點複雜,我不會深入解說所有細節,只做概括性的介紹。我們像之前一樣打開數據表。 |
| |
我們正在使用名為「列對話框」的命令。 |
| |
向使用者顯示選擇器…列選擇器。 |
| |
它有很多論點,我只用了其中幾個。我的做法是,給我一個「選擇商品」的按鈕,使用者最多只能選擇一列,而且必須至少選擇一列。 |
| |
那麼,讓我們從第 60 行開始執行這個腳本。 |
| |
開盤價,這是我的對話框,你看,我用很少的程式碼就實現了這麼豐富的對話框。這就是我們使用的列對話框的優點。所以我選擇咖啡,然後點擊確定。 |
| |
好的。回到腳本,我們剛剛運行了這一行程式碼。 |
| |
我們選擇的結果儲存在 dlg 中。我們來看一下。 |
| |
好的,這有點複雜。它說 dlg 是一個列表,你看那些花括號,而且我還看到了一些嵌套的花括號,所以它就像是嵌套列表。 |
| |
這裡用到了下標。我不會花太多時間解釋,但如果你需要這樣做,可以複製這段程式碼。所以,要從對話方塊中提取出包含「咖啡」的部分,也就是「咖啡」的列引用, |
| |
這是創建我的列的下標,所以運行這行程式碼。 |
| |
現在,我的列中只包含對咖啡列的引用,這與之前完全相同。我們使用以下命令運行圖表建構器 |
| |
我的 col,把它換成蘋果,這樣我們就能得到咖啡或用戶選擇的其他任何東西。 |
| |
好了,這就是我想和大家分享的所有內容。最後,我想給所有剛開始學習JSL程式設計的人一些建議。 |
| |
建議是,讓 JMP 盡可能幫你重寫程式碼。增強型日誌的作用就在於此,從日誌中提取程式碼。你的腳本大部分都是這樣產生的。 |
| |
然後你只需要寫連結部分,也就是把各個部分連結起來,最後形成一個可用的生產腳本。你也可以直接借鏡這些程式碼。你可以從腳本索引中藉鑑,當然也可以從這個簡報中藉鏡。 |
| |
本簡報包含所有資料,您還可以參考 JMP 使用者社群中的 JSL cookbook,這是一個非常棒的資源,其中包含許多常見的 JSL 任務,並為您提供完成這些任務所需的程式碼。 |
| |
我再次強調,真的不用太糾結文法。直接複製貼上程式碼,替換成你需要的部分更容易。你不會搞砸任何東西,而且隨著經驗的積累,你會慢慢掌握這種語法的精髓。 |
| |
非常感謝您的關注。 |