Re: 표현식 인덱싱: 표현식 트리를 올라가는 방법은 무엇입니까?이 작업을 수행할 수 있는 방법에 대한 몇 가지 옵션이 이미 있습니다(그러나 표현식 첨자가 유용할 수 있음). 제가 위시리스트 항목에서 언급한 것처럼 ( 표현식 인덱싱: 표현식 트리를 오르는 데 도움을 주세요 - JMP 사용자 커뮤니티 ), JMP에는 Wild() 및 Wild List()를 사용하는 Extract Expr()이 있습니다.
Names Default To Here(1);
myExpr = Expr(
gb = dt << Graph Builder(
Size(437, 413),
Graph Spacing(4),
Variables(X(:height), Y(:weight), Overlay(:sex)),
Elements(Points(X, Y, Legend(1)), Smoother(X, Y, Legend(2)))
)
);
yexpr = Extract Expr(myExpr, Y(Wild()));
variables_expr = Extract Expr(myExpr, Variables(Wild List()));
Names Default To Here(1);
myExpr = Expr(
gb = dt << Graph Builder(
Size(437, 413),
Graph Spacing(4),
Variables(X(:height), Y(:weight), Y(:height), Overlay(:sex)),
Elements(Points(X, Y, Legend(1)), Smoother(X, Y, Legend(2)))
)
);
variables_expr = Extract Expr(myExpr, Variables(Wild List()));
idx = 0;
For(i = 1, i <= N Arg(variables_expr), i++,
firstlevel = Arg(variables_expr, i); // could use Extract Expr
If(Head(firstlevel) == Expr(Y) & idx == 2,
secondlevel = Arg(firstlevel, 1);
);
);
show(secondlevel);
할 수 있는 다른 일도 있습니다(하지만 해야 할지 확실하지 않음).
Names Default To Here(1);
myExpr = Expr(
Variables(X(:height), Y(:weight), Y(:height), Overlay(:sex))
);
listconversion = Substitute(Name Expr(myExpr), Expr(Variables()), Expr(List()));
yexprs = {};
While(yexpr = Contains(listconversion, Extract Expr(listconversion, Y(Wild()))),
Insert Into(yexprs, Remove From(listconversion, yexpr));
);
show(yexprs);
yexprs[2];
목록으로 할 수 있는 다른 이상한 일이 있을 수도 있습니다...
고급 표현식, 매크로 및 목록(jmp.com) 잘 읽을 수 있다
표현 색인: 표현 트리를 어떻게 오를 수 있을까?이 글은 원래 위시리스트 항목으로 시작했지만, 그 소원이 이미 부분적으로나마 가능한 것으로 밝혀졌습니다(아래 @jthi 의 답변 참조).
그래서 결과를 더 잘 보이도록 여기로 옮겼습니다.
원래의 희망사항은 현재 가능한 기능을 넘어서는 기능을 요청하는 것으로, 여기에서 확인할 수 있습니다.
표현식 인덱싱: 읽기 및 쓰기 액세스
한번 살펴보시고 당신에게도 도움이 될지 판단해 보시기 바랍니다.
____________________________________________
많은 프로그래밍 언어에서 목록과 행렬을 인덱싱할 수 있습니다. 이는 Jmp에서도 가능합니다.
list= {"A", "B", "C"};
mat=[1,2,3];
list[3]
mat[2]
Jmp 13을 사용하면 데이터 테이블 구독이라는 또 다른 수준의 인덱싱이 가능해졌습니다.
요즘 사용자는 읽기 및 쓰기 권한으로 데이터 테이블의 항목을 쉽게 색인할 수 있습니다.
세 번째 종류의 인덱싱이 있습니다: 디스플레이 트리 인덱싱
지정된 보고서에 대해 디스플레이 트리를 따라 내려가면 특정 개체를 식별할 수 있습니다.
dt = Open( "$SAMPLE_DATA/Big Class.jmp" );
gb = dt << Graph Builder(
Size( 437, 413 ),
Graph Spacing( 4 ),
Variables( X( :height ), Y( :weight ), Overlay( :sex ) ),
Elements( Points( X, Y, Legend( 1 ) ), Smoother( X, Y, Legend( 2 ) ) )
)
Report(gb)["Graph Builder"][AxisBox(1)]
아마도 Jmp에는 인덱싱이 사용자의 일상 업무에 도움이 되는 곳이 더 많을 것입니다...
표현식의 경우 트리를 따라 내려가는 것이 훨씬 더 복잡합니다.
Y 변수 :weight를 얻으려면
myExpr=Expr(gb = dt << Graph Builder(
Size( 437, 413 ),
Graph Spacing( 4 ),
Variables( X( :height ), Y( :weight ), Overlay( :sex ) ),
Elements( Points( X, Y, Legend( 1 ) ), Smoother( X, Y, Legend( 2 ) ) )
));
하나는 사용해야 합니다
Arg(Arg(Arg(Arg(Arg(myExpr,2),2),3),2),1) // :weight
매우 취약해요!!!!
해결 방법: 변수 표현식을 목록으로 변환하고 목록 인덱싱을 사용합니다.
myExpr=Expr(Variables( X( :height ), Y( :weight ), Overlay( :sex ) ))
Substitute(Name Expr(myExpr),Expr(Variables()),Expr(List()))["Y"];
하지만 몇 가지 단점이 있습니다:
- 단일 레벨, 즉 평평한 계층 구조에서만 작동합니다.
- just the first named argument is found, further named arguments with the same identifier are ignored:
myExpr=Expr(Variables( X( :height ), Y( :weight ),Y(:height ), Overlay( :sex ) ));
Substitute(Name Expr(myExpr),Expr(Variables()),Expr(List()))["Y"]; // returns :weight, ignores Y(:height)
- just returns the first argument, further arguments get lost
myExpr = Expr(Distribution(columns(:height, :weight)));
Substitute(Name Expr(myExpr),Expr(Distribution()),Expr(List()))["columns"];
//returns :height -> :weight gets lost
디스플레이 트리 인덱싱과 유사하게 표현 트리를 오를 수 있는 가능성이 있습니까?
대신에
dt = Open( "$SAMPLE_DATA/Big Class.jmp" );
myExpr=Expr(gb = dt << Graph Builder(
Size( 437, 413 ),
Graph Spacing( 4 ),
Variables( X( :height ), Y( :weight ), Y(:height), Overlay( :sex ) ),
Elements( Points( X, Y, Legend( 1 ) ), Smoother( X, Y, Legend( 2 ) ) )
));
//instead of:
Arg(Arg(Arg(Arg(Arg(myExpr,2),2),3),3),1)
사용하고 싶습니다
myExpr[2][2["Variables"]["Y"(2)][1]
자동화 및 스크립팅Re: 표현 색인: 표현 트리를 어떻게 오를 수 있나요?@jthi 님 , 감사합니다. Extract Expr()은 트리의 올바른 수준에 도달하는 데 매우 유용합니다.
작년에 정말 많은 도움이 되었어요 : )
방금 한 레벨 내에서 인수 처리를 훨씬 더 쉽게 할 수 있다는 것을 알았습니다.
For Each , Transform Each 및 Filter Each는 표현식과 함께 사용할 수 있습니다. 멋지네요!

Main Script = Expr(dt << Graph Builder(
Size( 437, 413 ),
Graph Spacing( 4 ),
Variables( X( :height ), Y( :weight ), Y (:sex), Overlay( :sex ) ),
Elements( Points( X, Y, Legend( 1 ) ), Smoother( X, Y, Legend( 2 ) ) )
));
snippet = Extract Expr(Main Script, Variables(Wild List()))
For each({variable}, Name Expr(snippet), Show(Head(variable), Arg(variable)))
selection = Filter Each ({code}, Name Expr(snippet), Head(code)==Expr(Y()));
Show(selection)
changed= Transform Each ({code}, Name Expr(snippet), If (Head(code)==Expr(X()), Expr(my changed code),Name Expr(code)))
Show(changed);