Suchen und Extrahieren eines Ausdrucksarguments mit einem gegebenen AusdruckskopfIch möchte ein effizientes Skript schreiben, das als Eingabe einen JSL-Ausdruck verwendet und:
- Suchen Sie in diesem Ausdruck nach einem Argument, das einen bestimmten Ausdruckskopf hat
- Ersetzen Sie dieses Argument durch eine modifizierte Version dieses Arguments
Beispiel:
Ich habe diesen Ausdruck
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 />);Ich möchte das im Ausdruck verborgene Argument „LSMeans Contrast(...)“ finden und diesen Ausdruck in einen neuen Ausdruck extrahieren. Nennen wir ihn extrahierter_Ausdruck .
In diesem Fall möchte ich
extracted_expression = Expr(LS Means Contrast([1 0 -1]))
Ich möchte dann das Argument für diesen Ausdruck abrufen, es ändern und dann den extrahierten Ausdruck ändern und den ursprünglichen extrahierten Ausdruck durch den geänderten Argumentausdruck ersetzen. Beispiel:
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));
Der resultierende Ausdruck wäre
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] )}}}
)
)
Ich stecke bei Schritt 1 fest, nämlich wie ich die Argumente des ursprünglichen Ausdrucks durchlaufe, um das Argument zu finden, das einen Ausdruck mit der angegebenen Überschrift hat (in diesem Beispiel lautet die Überschrift des Arguments „LS Means Contrast “).
Irgendwelche Vorschläge/Ideen, wie das zu tun ist?
Automatisierung und SkriptingBetreff: Suchen und Extrahieren eines Ausdrucksarguments mit einem gegebenen AusdruckskopfBeachten Sie, dass dies nicht das eigentliche Problem ist, an dem ich arbeite. Der oben angegebene Ausdruck ist lediglich ein Beispiel, bei dem ein Ausdrucksargument tief in einem Ausdruck vergraben ist.
Betreff: Suchen und Extrahieren eines Ausdrucksarguments mit einem gegebenen AusdruckskopfAusdruck extrahieren() bewirkt den Zauber : )

Betreff: Suchen und Extrahieren eines Ausdrucksarguments mit einem gegebenen AusdruckskopfIst Extract Expr vielleicht das, wonach Sie suchen?
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);
Betreff: Suchen und Extrahieren eines Ausdrucksarguments mit einem gegebenen AusdruckskopfHier sind einige Details/Fallstricke von extract expr():
Ausdruck extrahieren
Betreff: Suchen und Extrahieren eines Ausdrucksarguments mit einem gegebenen AusdruckskopfWichtig zu wissen:
Ausdruck extrahieren() ist nicht gierig und stoppt, nachdem die erste Übereinstimmung gefunden wurde.
Andererseits IST Ersatz() gierig.
Der 2-stufige Ersatz im Code von @jthi ist unerlässlich!
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]);Hier liegt das Problem auf der Hand. Es gibt jedoch auch andere Fälle, in denen es schwieriger ist zu kontrollieren, welcher Ausdruck ersetzt wird.
Verwandte Wünsche:
Ersatz für erstes Vorkommen
:folded_hands: Ausdrucksindizierung: Lese- und Schreibzugriff
subst() - Ersatz() 2.0
Betreff: Suchen und Extrahieren eines Ausdrucksarguments mit einem gegebenen AusdruckskopfDanke @jthi und @hogi . Ich war mit Extract Expr() und dem Wild()-Ausdruck nicht vertraut. Funktioniert gut für das, woran ich gerade arbeite. Vielen Dank.