Re: 式のインデックス作成: 式ツリーを登るには?これを行う方法については、すでにいくつかのオプションがあります (ただし、式の添字が役立つ可能性があります)。 ウィッシュリストの項目で述べたように(式のインデックス作成: 式ツリーを登るのを手伝ってください - JMP ユーザー コミュニティ)、JMP には Wild() と Wild List() を使用する Extract Expr() があります。
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では、別のレベルのインデックス作成が可能になりました: データテーブルの添え字
現在、ユーザーは読み取りおよび書き込みアクセスを使用して、データ テーブル内のエントリを簡単にインデックスできます。
3番目の種類のインデックスがあります: ディスプレイツリーインデックス
特定のレポートについては、表示ツリーをたどって特定のオブジェクトを識別できます。
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変数:weightを取得するには
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]
自動化とスクリプトRe: 式のインデックス作成: 式ツリーを登るにはどうすればいいですか?ありがとうございます。 @jthi のExtract Expr() は、ツリーの正しいレベルに到達するのに非常に役立ちます。
昨年は大変助かりました:)
1 つのレベル内での引数の処理がはるかに簡単に実行できることに気付きました。
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);