我確實在一封電子郵件中提到了一些可能的主題,但這裡有一些想法:
- 使用參考文獻
- dt = Open()... 等等而不是 Current Data Table()
- 以穩健的方式在報告層中尋找報告/報告的引用
- 管理命名空間/範圍
- 初始化變數
- 尋找程式風格
- 以大寫形式寫入全域變量
- 使用表達式
- 試著抓
- 記錄
- 按鈕/視窗中的變數
- 特別是從函數返回時
- 上下文框(),視窗:
- 按鈕 - 路徑
- 打包腳本
- 無需使用大量的 JMP 創建腳本,而是將各個部分分離為更強大的腳本
- 最佳實踐
- 避免清除/刪除符號/全域變數
- 不要在腳本中留下清除日誌
- 鎖定變數/命名空間
- 路徑
- 轉換檔案路徑
- 預設目錄
- $PATH_VARIABLES
- 參考列
- Column(dt, "colname") vs dt:colname vs :colname, vs dt:"colname"n (和 AsColumn)等等...
- 浮點數學
- 三思而後行vs 編寫程式碼時請求寬恕比請求許可更容易
- 缺失值/空值
- 為空()、缺失()、If、IfMZ、N 項() > 0
- 檢查開啟的表、開啟的報告、已開啟的自訂視窗...
- << 將視窗置於前面
- .jsl 中的 Throw() 與 jmpaddin 的比較
- 自訂模態視窗函數
- 改進(和利用)JMP 創建的腳本
- 新增引用/變數
- 縮短 JMP 建立的腳本
- 避免派遣
- 使用者偏好如何影響這些(通常會導致非常大的問題)
- 理解並利用資料結構
- 例如,不需要將所有內容儲存在不同的變數名稱中(尤其是在使用 Eval Parse 時)
- 使用列表/關聯數組
- 如果談論UI,需要時可以參考
部分相關的貼文(由於「新」JMP 社群頁面,可能看起來極其混亂)
謝謝,在這裡我可以分享我的一些內容,但我所做的大部分內容已經在上面提到了:
- 嘗試(關閉(dt_ref,nosave)); dt_ref = Open(...) --> 清理表並且在第一次執行腳本時不會產生錯誤。問題是,您可以重新命名該表,但 JSL 仍會關閉它,因為 dt 引用也會切換。
- 使用始終選項卡來識別更大的循環和函數,這樣您就不會迷失在程式碼中並蒐索丟失的 );
- 如果您看到使用多語言的可能性,請考慮在製表步驟之後重新命名列。這可能會破壞其他用戶的程式碼,但你的工作正常。
- Try to dynamically work with reference in platform to avoid user inputs.
You could do this:
dt << Process screening(Process Variables({:Column 4, :Column 6, :Column 7}));
But you can also use this:
dt = current data table();
col_names = dt << get column names();
spec_list = {};
for(k=1,k<=nitems(col_names),k++,
if(!isempty(column(dt,k) << Get Property("Speclimits")),insertinto(spec_list,col_names[k]);););
dt << Process screening(Process Variables(eval(spec_list)));
altering a column name will then not break the code and the question about missing spec limits will not be triggered. -
我很可能會選擇附件之類的東西(我肯定沒有足夠的時間來完成所有這些,但這應該不是問題)。可能最終會得到類似「JSL 提示」之類的內容,但創建它需要足夠的時間。
坦克你賈莫,對劇本的一些想法:
第 103 行:僅當循環很短且僅在線上執行時才使用它。這使得程式碼更加成熟。
第 109 行:使用短名稱時,您可能會遇到用 Mean = (x1 + x2 ) / 2; 等變數覆寫 JMP 函數的問題。最好寫成 m_product_speed 或mean_product_speed。
第 149 行:我養成了在程式碼折疊的逗號後面註解 if 循環的習慣:
如果你寫出這樣的程式碼:
if(1,//average of x
mean_x = mean(x);
);
然後你折疊程式碼,它看起來像這樣:

它在 for 迴圈或 if 語句上方節省了一行。
第198行:「讓我們初始化矩陣,因為如果提前創建它,填充它會更快」。我和副駕駛一起花了 1 分鐘,我無法想像調試有 200 個註釋的代碼*g*。
第 212 行:我要提到的是,您可以使用日誌和工作流程作為參考,然後將程式碼變更為您的程式設計風格。當我要求非程式設計使用者使用我應該為他們編程的腳本來製定他們想要實現的目標的工作流程時,情況尤其如此。所以我對需求有很好的理解,大部分功能已經編碼。
第 391 行:當您在開啟圖形產生器的情況下迭代表時,這可以加快腳本速度,以免它在每次變更時更新圖形。
Names Default To Here( 1 );
try(close(dt,nosave));
dt = new table("test");
dt << New Column( "Y",
Numeric,
"Continuous",
Format( "Best", 12 ),
<<SET initial="" data="https://community.jmp.com/"></SET><SPAN>第414 行:除此之外,我還要添加:當您在使用<< Subset 等函數時給出固定名稱時,始終添加表引用)當生成名稱已存在且JMP 自動添加“ 2”時,這非常有幫助“ 在最後。如果沒有參考,您可能會意外地在錯誤的表上工作。</SPAN>
<SPAN>第 74 行:這是我會為我的腳本竊取的東西</SPAN>:)</img>
<SPAN>line757:這有時也會減慢 for 迴圈的速度。但在處理 SQL 語句時很有用,因為發送請求可能會佔用腳本的其餘部分並導致錯誤,因為獲取資料可能需要一些時間,但在逐行執行程式碼時它可以正常工作。</SPAN>
line 780: maybe referencing to the JSL cook book? <A href="https://community.jmp.com/t5/JSL-Cookbook/tkb-p/jmp-scripting" target="_blank">JSL 食譜 - JMP 使用者社區</A>
line 787: Just be aware that this will also break when a report reference name contains a variable.
This is what happened here: <A href="https://community.jmp.com/t5/Discussions/fitting-truncated-data-to-a-continuous-distribution/m-p/772495#M95287" target="_blank">回覆:將截斷資料擬合為連續分佈 - JMP 用戶社群</A>
the detection limits is added with censored data in the title and can change depending on the data set.
THX a lot for the script.<BR /><BR />Regards<BR /> Mauro
787線
這正是為什麼幾乎總是使用帶有 helpKey 屬性的 XPath(如果可用)的原因(我不關心大綱框標題)。有太多方法(嘗試)建立可靠的參考資料,我可以花大約 20 分鐘的時間來舉例說明。
例如,對於檢測限制,我將使用 helpKey 或通配符(如果我知道輪廓框名稱可以更改...)
Names Default To Here(1);
dt = open("$SAMPLE_DATA/Big Class.jmp");
Column(dt, "height") << Set Property("Detection Limits", {60, 100});
dist = dt << Distribution(
Stack(1),
Continuous Distribution(
Column(:height),
Horizontal Layout(1),
Vertical(0),
Process Capability(0),
Fit Normal
)
);
obs = Report(dist) << XPath("//OutlineBox[@helpKey='FitDistributions']");
show(obs << get title);
// Or
ob = Report(dist)[OutlineBox("Fitted Normal Distribution?")];
show(ob << get title);
// Or
obs2 = Report(dist) << XPath("//OutlineBox[contains(text(), 'Fitted Normal Distribution')]");
show(ob << get title);
</CODE></P>
<P>I also added few things based on your comments. Thanks!<CODE class=" language-jsl">