網路上一些有用的資源:
- 在探索高峰會系列講座中, @joseph_morgan有一場精彩的演講:
https://community.jmp.com/t5/Abstracts/Using-JSL-to-Develop-Efficient-Robust-Applications-EU-2018-415/ev-p/849638
Joseph 解釋了JSL 中表達式處理的秘密和可能性,以及與該功能相關的陷阱。
本次講座的內容是基於《表達式處理函數:第一部分-揭開Expr()、NameExpr()、Eval()等函數的謎題》一書。
- @Jasean 動態編寫 JSL 程式碼
(通用技巧#1和#2的詳細步驟指南,請參見下文)
- 字串和表達式的差別-50行簡述:
回覆@Craige_Hales的社區帖子
- 很棒的課程,有很多應用案例: 第九課:高級JSL , @jthi
- 更多資訊請參閱腳本指南: 進階表達式、巨集和列表
基礎知識
內部的:
#062 - JSL 中的表達式處理
#092 - 表達式處理
| 1 |
不要計算表達式 (2+1), 只需將其儲存在變數x中即可。 |
x= Expr (2+1) |
| 2 |
取得儲存在x中的表達式。 |
名稱表達式(x) |
| 3 |
力量評估 |
評估(myexpr) |
| 4 |
評估xyz和 將表達式(xyz)替換為回傳值 |
評估表達式( ... 表達式(xyz)) |
*)注意:在第 1 題和第 4 題中,函數「 Expr(...)」相同,但效果相反:
在 1 中, Expr的內容不會被求值;在 4 中,只有Expr的內容會被求值。
3個通用技巧
| 1 |
透過EvalExpr() 函數預先計算表達式的部分值 然後透過Eval()函數計算表達式的值。 解決了90%的問題(方案二可解決99%的問題)。 |
Eval( 評估實驗 ( ... Exp (eval 1st) ...)) 選項 2: Eval( 評估實驗 ( ... Exp (Name Expr( )) ...))
|
| 2 |
解決了同樣的99%的問題 選項 1 - 選項 2 |
Eval(substitute(Expr(), Expr(), Name Expr() ))
|
| 3 |
ultimate trick for 列引用 ( @jthi, e.g. 第九課:高級JSL @33min ) |
名稱表達式(作為列("column name" or :柱子)) |
註:
有些函數會求值其參數,有些則不會,有些函數會求值部分參數-例如`head()`函數會在某種程度上求值: `head()` 函數會求值其參數嗎? ——還有一些函數會求值其參數,但如果參數是單一變量,它們的行為就類似於`NameExpr()` 函數: 例外情況是實用程式 `Show`、`Write` 和 `Print`…
遺憾的是,這些細節大部分用戶都無法獲取,只能靠猜測。
我希望 JSL 編輯器能夠透過互動式方式向使用者顯示以下資訊來幫助使用者: JSL 編輯器中的進階語法高亮顯示 - 函數是否會對其參數求值?
-> 如果您想獲得這項自動支持,請點擊連結並投票!
社區範例:
[更多的主題容器像這樣]
嗨@hogi ,
感謝您整合這些資訊並將大量資訊匯集在一起。談話聽起來確實內容豐富。
我確實喜歡在 JMP 和 JSL 中以多種不同的方式完成任務,但有時有太多不同的方式專門針對當前的情況,當嘗試編寫通用且通用的程式碼時,這可能會變得有些麻煩。處理許多不同的場景。
謝謝!
DS
JSL 和變數 - 編寫 JSL 程式碼時應該注意的 3 個問題。
不同的問題,總是相同的解決方案:)
解決方案?
-> 剛剛讀到主帖。
c= 5;
col = Name Expr(:height);
dt = Open( "$SAMPLE_DATA/Big Class.jmp" );
gb = graph Builder(); framebox = report(gb)[FrameBox(1)];
// issues with variables in a message
// all 3 of them look quite innocent
// but none of them will survive a restart
New Column ("rescaled", Formula (c * :height));
dt << New Column ("rescaled", Formula (5 * col));
framebox << Add Graphics Script(Y Function( c * x, x ) );
// no issue here:
dt << concatenate(dt);
dt << new column(c, formula(3));人們可能會想:永遠不要在訊息中使用變數!
但這太過分了——最後兩個例子都沒有問題。