指定された式ヘッドを持つ式引数を検索して抽出するJSL 式を入力として受け取り、次の操作を実行する効率的なスクリプトを作成したいと考えています。
- 特定の式ヘッドを持つ式内の引数を検索する
- その議論を修正したバージョンに置き換える
例:
私はこの表現を持っています
my_expr=Expr(<BR />Fit Model(
Y( :y ),
Effects( :Drug, :x ),
Personality( "Standard Least Squares" ),
Emphasis( "Effect Leverage" ),
Run(
:y << {Summary of Fit( 1 ), Analysis of Variance( 1 ),
Parameter Estimates( 1 ), Scaled Estimates( 0 ),
Plot Actual by Predicted( 1 ), Plot Residual by Predicted( 1 ),
Plot Studentized Residuals( 0 ), Plot Effect Leverage( 1 ),
Plot Residual by Normal Quantiles( 0 ), Box Cox Y Transformation( 0 ),
{:Drug << {LSMeans Contrast( [1 0 -1] )}}}
)
)<BR />);式の中に埋め込まれている「LSMeans Contrast(...)」引数を見つけて、その式を新しい式に抽出し、それを抽出された表現と呼びます。
だからこの場合私は
extracted_expression = Expr(LS Means Contrast([1 0 -1]))
次に、その式の引数を取得して変更し、extracted_expression を変更して、変更された引数式を元の抽出された式に置き換えます。 たとえば、次のようになります。
new_expression=Substitute(Name Expr(extracted_expression), arg(extracted_expression,1), [-1 0 .5]);
Substitute(Name Expr(my_expr), Name Expr(extracted_expression), Name Expr(new_expression));
結果の式は次のようになる。
Fit Model(
Y( :y ),
Effects( :Drug, :x ),
Personality( "Standard Least Squares" ),
Emphasis( "Effect Leverage" ),
Run(
:y << {Summary of Fit( 1 ), Analysis of Variance( 1 ),
Parameter Estimates( 1 ), Scaled Estimates( 0 ),
Plot Actual by Predicted( 1 ), Plot Residual by Predicted( 1 ),
Plot Studentized Residuals( 0 ), Plot Effect Leverage( 1 ),
Plot Residual by Normal Quantiles( 0 ), Box Cox Y Transformation( 0 ),
{:Drug << {LS Means Contrast( [-1 0 0.5] )}}}
)
)
私が行き詰まっているのは、ステップ 1、つまり、元の式の引数を走査して、指定されたヘッダーを持つ式を持つ引数を見つける方法です (この例では、引数のヘッダーはLSはコントラストを意味しますです)。
これを実行する方法について何か提案やアイデアはありますか?
自動化とスクリプトRe: 指定された式ヘッドを持つ式引数を検索して抽出する注意: これは私が取り組んでいる実際の問題ではありません。上記の式は、式の奥深くに式引数が埋め込まれている単なる例です。
Re: 指定された式ヘッドを持つ式引数を検索して抽出するExtract Expr() が魔法をかけます:)

Re: 指定された式ヘッドを持つ式引数を検索して抽出するあなたが探しているのは、Extract Expr でしょうか?
Names Default To Here(1);
my_expr=Expr(Fit Model(
Y( :y ),
Effects( :Drug, :x ),
Personality( "Standard Least Squares" ),
Emphasis( "Effect Leverage" ),
Run(
:y << {Summary of Fit( 1 ), Analysis of Variance( 1 ),
Parameter Estimates( 1 ), Scaled Estimates( 0 ),
Plot Actual by Predicted( 1 ), Plot Residual by Predicted( 1 ),
Plot Studentized Residuals( 0 ), Plot Effect Leverage( 1 ),
Plot Residual by Normal Quantiles( 0 ), Box Cox Y Transformation( 0 ),
{:Drug << {LSMeans Contrast( [1 0 -1] )}}}
)
));
myhead = Extract Expr(my_expr, LSMeans Contrast(Wild()));
myarg = Arg(part, 1);
//show(myhead, myarg);
new_expr = Substitute(Name Expr(myhead), myarg, [1 0 1]);
my_expr2 = Substitute(Name Expr(my_expr), Name Expr(myhead), Name Expr(new_expr));
Show(my_expr, my_expr2);
Re: 指定された式ヘッドを持つ式引数を検索して抽出するextract expr() の詳細と落とし穴は次のとおりです。
抽出式
Re: 指定された式ヘッドを持つ式引数を検索して抽出する知っておくべき重要なこと:
extract expr() は貪欲ではないので、最初の一致が見つかったら停止します。
一方、 Substitute() は貪欲です。
フォローのコード内の 2 ステップのSubstitute は不可欠です。
my_expr=Expr(Fit Model(
{:Drug << {LSMeans Contrast( [1 0 -1] )}}
);
[1 0 -1] // another time the same Arg, lives in danger
);
part= Extract Expr(my_expr, LSMeans Contrast(Wild()));
myarg = Arg(part, 1); //part instead of myhead
new_expr = Substitute(Name Expr(myhead), myarg, [1 0 1]);
my_expr2 = Substitute(Name Expr(my_expr), Name Expr(myhead), Name Expr(new_expr));<BR /><BR />// won't work<BR />// my_expr3 = Substitute(Name Expr(my_expr), Name Expr(myarg), [1 0 1]);ここでは問題は明らかですが、どの式が置換されるかを制御するのがより難しい場合もあります。
関連する願い:
最初の出現を置換
:folded_hands: 式のインデックス作成: 読み取りおよび書き込みアクセス
subst() - 置換() 2.0
Re: 指定された式ヘッドを持つ式引数を検索して抽出するフォローとホギに感謝します。Extract Expr() と Wild() 式についてはよく知りませんでした。私が実際に取り組んでいる作業にはうまく機能します。とても感謝しています。