주어진 표현식 헤드를 사용하여 표현식 인수를 찾아 추출합니다.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]))
그런 다음 해당 표현식에 대한 인수를 가져와 수정하고, 그 다음 추출된 표현식을 수정하고, 수정된 인수 표현식을 원래 추출된 표현식으로 대체하고 싶습니다. 예를 들어:
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: 주어진 표현식 헤드를 사용하여 표현식 인수를 찾아 추출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()는 탐욕적입니다.
@jthi 의 코드에서 2단계 대체가 필수입니다!
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: 주어진 표현식 헤드를 사용하여 표현식 인수를 찾아 추출@jthi 와 @호기 에게 감사합니다. 저는 Extract Expr()과 Wild() 표현식에 익숙하지 않았습니다. 제가 실제로 작업하고 있는 것에는 잘 맞습니다. 정말 감사합니다.