Responder a todos: Cómo crear un script de contenido dinámico para Graph BuilderAlguien en el foro de Comunidades de SAS preguntó esto. Querían escribir un script que creara un informe del Generador de Gráficos sin saber de antemano cuántas variables habría. Es decir, no sabrían cuántas variables habría al escribir el script, pero el script sí las sabría en tiempo de ejecución.
El intento original contenía un script de Graph Builder dentro de un bucle sobre las columnas, pero lo ejecutaba n veces, una por cada iteración del bucle. En su lugar, es necesario construir un único script que represente el número variable de columnas y luego ejecutarlo. JSL admite este tipo de metaprogramación (un script que crea otro script) mediante las funciones Expr(), Name Expr() y Eval Expr(). Estas funciones son bastante avanzadas, pero también muy potentes.
Primero creamos un informe representativo de Graph Builder y guardamos su script:
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 ) )
)
);
Luego tomamos nota de las partes que queremos parametrizar (en este caso, las variables Y) y usamos un script para crear esa parte en función de la información de tiempo de ejecución y luego la pegamos en la expresión general.
// 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
Hay maneras de conseguir el mismo efecto. Una técnica similar, pero a menudo más sencilla de entender, consiste en construir el script como una cadena de texto y, al terminar, ejecutar Parse() y Eval(). Otra opción: Graph Builder también admite mensajes como "Añadir variable", que pueden modificar un informe ya creado.
Re: Responder a todos: Cómo crear un script de contenido dinámico para Graph Builderdt = 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: Responder a todos: Cómo crear un script de contenido dinámico para Graph Builder¡Gracias expertos!
Intenté modificar JSL de la misma manera, pero aún así no funcionó.
Simplemente hice un gráfico de barras simple y usé los mismos valores superiores e inferiores para cada barra.
¿Quieres ayuda con un experto para completar esta denominación dinámica de columnas? ¡Muchas gracias!
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 )} )
)
);
