回覆:表達式索引:如何爬表達式樹?已經有一些關於如何執行此操作的選項(但表達式下標可能很有用)。 就像我在願望清單項目中提到的(表達式索引:幫助我爬上表達式樹 - JMP 使用者社區),JMP 確實有 Extract Expr(),它使用 Wild() 和 Wild List()
Names Default To Here(1);
myExpr = Expr(
gb = dt << Graph Builder(
Size(437, 413),
Graph Spacing(4),
Variables(X(:height), Y(:weight), Overlay(:sex)),
Elements(Points(X, Y, Legend(1)), Smoother(X, Y, Legend(2)))
)
);
yexpr = Extract Expr(myExpr, Y(Wild()));
variables_expr = Extract Expr(myExpr, Variables(Wild List()));
Names Default To Here(1);
myExpr = Expr(
gb = dt << Graph Builder(
Size(437, 413),
Graph Spacing(4),
Variables(X(:height), Y(:weight), Y(:height), Overlay(:sex)),
Elements(Points(X, Y, Legend(1)), Smoother(X, Y, Legend(2)))
)
);
variables_expr = Extract Expr(myExpr, Variables(Wild List()));
idx = 0;
For(i = 1, i <= N Arg(variables_expr), i++,
firstlevel = Arg(variables_expr, i); // could use Extract Expr
If(Head(firstlevel) == Expr(Y) & idx == 2,
secondlevel = Arg(firstlevel, 1);
);
);
show(secondlevel);
您還可以做其他事情(但不確定是否應該這樣做)
Names Default To Here(1);
myExpr = Expr(
Variables(X(:height), Y(:weight), Y(:height), Overlay(:sex))
);
listconversion = Substitute(Name Expr(myExpr), Expr(Variables()), Expr(List()));
yexprs = {};
While(yexpr = Contains(listconversion, Extract Expr(listconversion, Y(Wild()))),
Insert Into(yexprs, Remove From(listconversion, yexpr));
);
show(yexprs);
yexprs[2];
你也可以用清單做其他奇怪的事情...
高級表達式、巨集和列表 (jmp.com)可以很好地閱讀
表達式索引:如何爬表達式樹?這篇文章是作為一個願望清單條目誕生的 - 但事實證明,這個願望已經部分實現了(參見下面@jthi的回答)。
所以我把它移到這裡以使結果更明顯。
最初的願望 - 要求提供超越現有功能的功能 - 可以在這裡找到:
表達式索引:讀寫訪問
請看一下並決定它是否也可以幫助您...
___________________________________________
在許多程式語言中,可以對列表和矩陣進行索引。這在 Jmp 中也是可能的:
list= {"A", "B", "C"};
mat=[1,2,3];
list[3]
mat[2]
使用 Jmp 13,可以實現另一個層級的索引: 資料表下標
如今,用戶可以輕鬆地透過讀寫存取來索引資料表中的條目。
還有第三種索引:顯示樹索引
對於給定的報告,您可以沿著顯示樹向下查找以識別特定物件:
dt = Open( "$SAMPLE_DATA/Big Class.jmp" );
gb = dt << Graph Builder(
Size( 437, 413 ),
Graph Spacing( 4 ),
Variables( X( :height ), Y( :weight ), Overlay( :sex ) ),
Elements( Points( X, Y, Legend( 1 ) ), Smoother( X, Y, Legend( 2 ) ) )
)
Report(gb)["Graph Builder"][AxisBox(1)]
也許 Jmp 中有更多地方索引可以幫助使用者完成日常工作...
對於表達式來說,沿著樹走下去要複雜得多:
取得 Y 變數:權重
myExpr=Expr(gb = dt << Graph Builder(
Size( 437, 413 ),
Graph Spacing( 4 ),
Variables( X( :height ), Y( :weight ), Overlay( :sex ) ),
Elements( Points( X, Y, Legend( 1 ) ), Smoother( X, Y, Legend( 2 ) ) )
));
一個人必須使用
Arg(Arg(Arg(Arg(Arg(myExpr,2),2),3),2),1) // :weight
非常脆弱!
解決方法:將變數表達式轉換為列表並使用列表索引:
myExpr=Expr(Variables( X( :height ), Y( :weight ), Overlay( :sex ) ))
Substitute(Name Expr(myExpr),Expr(Variables()),Expr(List()))["Y"];
但也有幾個缺點:
- 僅適用於單級 - 扁平層次結構
- just the first named argument is found, further named arguments with the same identifier are ignored:
myExpr=Expr(Variables( X( :height ), Y( :weight ),Y(:height ), Overlay( :sex ) ));
Substitute(Name Expr(myExpr),Expr(Variables()),Expr(List()))["Y"]; // returns :weight, ignores Y(:height)
- just returns the first argument, further arguments get lost
myExpr = Expr(Distribution(columns(:height, :weight)));
Substitute(Name Expr(myExpr),Expr(Distribution()),Expr(List()))["columns"];
//returns :height -> :weight gets lost
是否有可能類似於顯示樹索引來攀爬表達式樹?
而不是
dt = Open( "$SAMPLE_DATA/Big Class.jmp" );
myExpr=Expr(gb = dt << Graph Builder(
Size( 437, 413 ),
Graph Spacing( 4 ),
Variables( X( :height ), Y( :weight ), Y(:height), Overlay( :sex ) ),
Elements( Points( X, Y, Legend( 1 ) ), Smoother( X, Y, Legend( 2 ) ) )
));
//instead of:
Arg(Arg(Arg(Arg(Arg(myExpr,2),2),3),3),1)
我想用
myExpr[2][2["Variables"]["Y"(2)][1]
自動化和腳本編寫回覆:表達式索引:如何爬表達式樹?謝謝, @jthi Extract Expr()對於到達樹的正確級別非常有幫助。
去年這對我幫助很大:)
我只是注意到一級內參數的處理可以更容易完成:
For Each 、 Transform Each和Filter Each可以與表達式一起使用。涼爽的!

Main Script = Expr(dt << Graph Builder(
Size( 437, 413 ),
Graph Spacing( 4 ),
Variables( X( :height ), Y( :weight ), Y (:sex), Overlay( :sex ) ),
Elements( Points( X, Y, Legend( 1 ) ), Smoother( X, Y, Legend( 2 ) ) )
));
snippet = Extract Expr(Main Script, Variables(Wild List()))
For each({variable}, Name Expr(snippet), Show(Head(variable), Arg(variable)))
selection = Filter Each ({code}, Name Expr(snippet), Head(code)==Expr(Y()));
Show(selection)
changed= Transform Each ({code}, Name Expr(snippet), If (Head(code)==Expr(X()), Expr(my changed code),Name Expr(code)))
Show(changed);