Buscar y extraer un argumento de expresión con un encabezado de expresión dadoQuiero escribir un script eficiente que tome como entrada una expresión JSL y:
- Encuentre un argumento en esa expresión que tenga un encabezado de expresión específico
- Sustituya ese argumento con una versión modificada de ese argumento.
Ejemplo:
Tengo esta expresión
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 />);Quiero encontrar el argumento "LSMeans Contrast(...)" que está enterrado en la expresión y extraer esa expresión en una nueva expresión, llamémosla expresión extraída .
Entonces en este caso quiero
extracted_expression = Expr(LS Means Contrast([1 0 -1]))
Luego quiero obtener el argumento de esa expresión, modificarlo y luego modificar la expresión extraída y sustituir la expresión del argumento modificado por la expresión extraída original. Por ejemplo:
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));
La expresión resultante sería
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] )}}}
)
)
Donde me estoy atascando es en el paso 1, cómo recorrer los argumentos de la expresión original para encontrar el argumento que tiene una expresión con el encabezado especificado (en este ejemplo, el encabezado del argumento es LS significa contraste ).
¿Alguna sugerencia/idea sobre cómo hacer esto?
Automatización y scriptingRe: Buscar y extraer un argumento de expresión con un encabezado de expresión dadoTenga en cuenta que este no es el problema real en el que estoy trabajando, la expresión proporcionada anteriormente es solo un ejemplo que tiene un argumento de expresión enterrado profundamente en una expresión.
Re: Buscar y extraer un argumento de expresión con un encabezado de expresión dadoExtraer Expr() hace la magia 

Re: Buscar y extraer un argumento de expresión con un encabezado de expresión dado¿Extract Expr quizás sea lo que estás buscando?
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: Buscar y extraer un argumento de expresión con un encabezado de expresión dadoA continuación se muestran algunos detalles/dificultades de la extracción expr():
Extraer Expr
Re: Buscar y extraer un argumento de expresión con un encabezado de expresión dadoImportante saber:
extraer expr() no es codicioso, se detendrá después de encontrar la primera coincidencia.
Por otro lado, Sustituto() ES codicioso.
¡El sustituto de 2 pasos en el código de @jthi es esencial!
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]);Aquí el problema es obvio, pero hay otros casos en los que es más difícil controlar qué expresión se sustituye.
Deseos relacionados:
Sustituir primera ocurrencia
:folded_hands: Indexación de expresiones: acceso de lectura y escritura
subst() - sustituto() 2.0
Re: Buscar y extraer un argumento de expresión con un encabezado de expresión dadoGracias @jthi y @hogi . No estaba familiarizado con Extract Expr() y la expresión Wild(). Funciona bien para lo que estoy haciendo actualmente. Se lo agradezco mucho.