全員に返信: グラフビルダーの動的コンテンツをスクリプト化する方法SASコミュニティフォーラムで、ある人がこの質問をしました。彼らは、変数の数が事前に分からなくてもグラフビルダーレポートを作成するスクリプトを書きたいと考えていました。つまり、スクリプト作成時には変数の数は分からず、実行時にスクリプト側で変数の数が分かるというわけです。
当初の試みでは、列をループするループ内にグラフビルダースクリプトが含まれていましたが、ループの反復ごとにグラフビルダーがn回起動されていました。代わりに、可変数の列を考慮した単一のスクリプトを何らかの方法で作成し、そのスクリプトを実行する必要があります。JSLは、Expr()、Name Expr()、Eval Expr()関数を使用して、この種のメタプログラミング(スクリプトから別のスクリプトを作成する)をサポートしています。これらは非常に高度な関数ですが、非常に強力です。
まず、代表的なグラフ ビルダー レポートを作成し、そのスクリプトを保存します。
Graph Builder(
Show Control Panel( 0 ),
Variables(
X( :Country ),
Y( :Score, Side( "Right" ) ),
Y( :Long Jump, Position( 1 ) ),
Y( :Shot Put, Position( 1 ) )
),
Elements(
Points( X, Y( 2 ), Y( 3 ), Legend( 1 ) ),
Line( X, Y( 1 ), Legend( 2 ) )
)
);
次に、パラメータ化する部分(この場合は Y 変数)をメモし、スクリプトを使用して実行時情報に基づいてその部分を作成し、それを全体の式に貼り付けます。
// a table with lots of columns
dt = Open( "$SAMPLE_DATA/Decathlon.jmp" );
// an expression for the graph's variables
vars = Expr( Variables( X( :Country ), Y( :Score, Side( "Right" ) ) ) );
// an expression for Points elements
points = Expr( Points( X, Jitter( 1 ) ) );
// a loop to programmitically insert variables into those expressions
first col = 4;
last col = 6;
For( i = first col, i <= last col, i++,
Insert Into( vars, Eval Expr( Y( Expr( Column( dt, i ) ), Position( 1 ) ) ) );
Insert Into( points, Eval Expr( Y( Expr( i - first col + 2 ) ) ), 1 + i - first col );
);
//Show( vars, points );
// build the Graph Builder expression from those
gb = Eval Expr(
Graph Builder(
Show Control Panel( 0 ),
Expr( Name Expr( vars ) ),
Elements( Expr( Name Expr( points ) ), Line( X, Y( 1 ) ) )
)
);
//show( gb );
gb; // execute the expression
同じ効果を得る方法はいくつかあります。似たような方法ではありますが、より分かりやすいのは、スクリプトをテキスト文字列として構築し、完了したらParse()とEval()を呼び出す方法です。別の方法として、Graph Builderは「変数の追加」などのメッセージもサポートしており、既に構築済みのGraph Builderレポートを変更できます。
Re: 全員に返信: グラフビルダーの動的コンテンツのスクリプト作成方法これは機能するが、間違っている
- 専門家の皆様、ありがとうございます!
dt = Open( "$SAMPLE_DATA/Big Class.jmp" );
dt << New Column( "col1", Numeric, Continuous, Set Formula( Col Shuffle() ) );
dt << New Column( "col2", Numeric, Continuous, Set Formula( Col Shuffle() ) );
dt << New Column( "col3", Numeric, Continuous, Set Formula( Col Shuffle() ) );
m1 = 1; m2 = 180; m0 = 10;
one=Expr(Variables( X( Transform Column( "Row", Formula( Row() ))) , Y( :height ) ));two=Expr(Elements( Position( 1, 1 ), Bar( X, Y, Legend( 5 ) ) ) );thr=Expr( Dispatch( {}, "height", ScaleBox, {Min( m1 ), Max( m2 ), Inc( m0 ), Minor Ticks( 1 )} ));
first co = 5;last col = 8;
For( i = first co, i <= last col, i++,
Insert Into( one, Eval Expr( Y( Expr( Column( dt, i ) ) ) ) );
Insert Into( two, Eval Expr(Elements( Position( 1, Expr(i-3 )), Bar( X, Y, Legend( Expr(1+i )) ) ) ));
Insert Into( thr, Eval Expr( Dispatch( {}, Column(Expr(i))<
<GET name=""></GET>
Re: 全員に返信: グラフビルダーの動的コンテンツのスクリプト作成方法専門家の皆様、ありがとうございます!
同じように JSL を変更しようとしましたが、それでも機能しませんでした。
単純な棒グラフを作成し、各棒に同じ上限値と下限値を使用しました。
この動的な列の命名を完了する方法について専門家に助けを求めてください。どうもありがとうございます!
dt = Open( "$SAMPLE_DATA/Big Class.jmp" );
dt << New Column( "col1", Numeric, Continuous, Set Formula( Col Shuffle() ) );
dt << New Column( "col2", Numeric, Continuous, Set Formula( Col Shuffle() ) );
dt << New Column( "col3", Numeric, Continuous, Set Formula( Col Shuffle() ) );
m1 = 1; m2 = 180; m0 = 10;
p1 = dt << Graph Builder(
Size( 519, 841 ),
Show Control Panel( 0 ),
Show Legend( 0 ),
Show Title( 0 ),
Show Footer( 0 ),
Show X Axis( 0 ),
Show Y Axis( 0 ),
Show X Axis Title( 0 ),
Variables( X( Transform Column( "Row", Formula( Row() ) ) ), Y( :height ), Y( :weight ), Y( :col1 ), Y( :col2 ), Y( :col3 ) ),
Elements( Position( 1, 1 ), Bar( X, Y, Legend( 5 ) ) ),
Elements( Position( 1, 2 ), Bar( X, Y, Legend( 6 ) ) ),
Elements( Position( 1, 3 ), Bar( X, Y, Legend( 7 ) ) ),
Elements( Position( 1, 4 ), Bar( X, Y, Legend( 8 ) ) ),
Elements( Position( 1, 5 ), Bar( X, Y, Legend( 9 ) ) ),
SendToReport(
Dispatch( {}, "height", ScaleBox, {Min( m1 ), Max( m2 ), Inc( m0 ), Minor Ticks( 1 )} ),
Dispatch( {}, "weight", ScaleBox, {Min( m1 ), Max( m2 ), Inc( m0 ), Minor Ticks( 1 )} ),
Dispatch( {}, "col1", ScaleBox( 2 ), {Min( m1 ), Max( m2 ), Inc( m0 ), Minor Ticks( 1 )} ),
Dispatch( {}, "col2", ScaleBox, {Min( m1 ), Max( m2 ), Inc( m0 ), Minor Ticks( 1 )} ),
Dispatch( {}, "col3", ScaleBox, {Min( m1 ), Max( m2 ), Inc( m0 ), Minor Ticks( 1 )} )
)
);
