Rechercher et extraire un argument d'expression avec une tête d'expression donnéeJe souhaite écrire un script efficace qui prendra en entrée une expression JSL et :
- Trouver un argument dans cette expression qui a une tête d'expression spécifique
- Remplacez cet argument par une version modifiée de cet argument
Exemple:
J'ai cette expression
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 />);Je veux trouver l'argument "LSMeans Contrast(...)" qui est enterré dans l'expression et extraire cette expression dans une nouvelle expression, appelons cela extract_expression .
Donc dans ce cas je veux
extracted_expression = Expr(LS Means Contrast([1 0 -1]))
Je souhaite ensuite obtenir l'argument de cette expression, le modifier, puis modifier l'expression extraite et remplacer l'expression d'argument modifiée par l'expression extraite d'origine. Par exemple :
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));
L'expression résultante serait
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] )}}}
)
)
Là où je suis bloqué, c'est à l'étape 1, comment parcourir les arguments de l'expression d'origine pour trouver l'argument qui a une expression avec l'en-tête spécifié (dans cet exemple, l'en-tête de l'argument est LS signifie Contraste ).
Des suggestions/idées sur la façon de procéder ?
Automatisation et scriptsRe: Rechercher et extraire un argument d'expression avec une tête d'expression donnéeNotez que ce n’est pas le vrai problème sur lequel je travaille, l’expression fournie ci-dessus n’est qu’un exemple qui a un argument d’expression enfoui profondément dans une expression.
Re: Rechercher et extraire un argument d'expression avec une tête d'expression donnéeExtraire Expr() fait la magie : )

Re: Rechercher et extraire un argument d'expression avec une tête d'expression donnéeExtraire Expr peut-être ce que vous cherchez ?
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: Rechercher et extraire un argument d'expression avec une tête d'expression donnéeVoici quelques détails/pièges de l'extraction d'expr() :
Extraire l'expression
Re: Rechercher et extraire un argument d'expression avec une tête d'expression donnéeimportant à savoir:
extraire expr() n'est pas gourmand, il s'arrêtera après avoir trouvé la première correspondance.
D'un autre côté, Remplaçant() EST gourmand.
Le remplacement en 2 étapes dans le code de @jthi est essentiel !
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]);Ici, le problème est évident – mais il existe d’autres cas où il est plus difficile de contrôler quelle expression est substituée.
souhaits associés :
Remplacer la première occurrence
:folded_hands: Indexation des expressions : accès en lecture et en écriture
subst() - substitut() 2.0
Re: Rechercher et extraire un argument d'expression avec une tête d'expression donnéeMerci @jthi et @hogi . Je ne connaissais pas Extract Expr() et l'expression Wild(). Cela fonctionne bien pour ce sur quoi je travaille actuellement. Merci beaucoup.