Ayer encontré el siguiente hilo, que me hizo investigar parse().
https://community.jmp.com/t5/Discussions/evaluating-a-string-using-a-column-formula/mp/38028
El proceso de pensamiento es el siguiente:
- Al usar expr(), JMP espera funciones como argumento, no otros argumentos. Más sobre esto más adelante.
- Si los argumentos pueden guardarse en una variable como una cadena y luego colocarse en otro argumento o función, esto ayudará a codificar lo que se necesita.
Aquí hay un ejemplo.
names default to here(1);
clear log();
clear symbols();
dt = open( "$SAMPLE_DATA/Big Class.jmp" );
dt << Graph Builder(
Size( 517, 447 ),
Show Control Panel( 0 ),
Fit to Window,
Set α Level( 0.05 ),
Variables( X( :weight ), Y( :height ), Color( :sex ) ),
Elements( Points( X, Y, Legend( 3 ) ) ),
SendToReport(
Dispatch(
{},
"height",
ScaleBox,
{Add Ref Line( 67.5, "Solid", "Black", "Tall", 1 )}
)
)
);El script abre Big Class.jmp y luego genera una visualización con una línea de referencia. Cuando quiero extraer datos de otras fuentes para la visualización, podría modificar el script anterior a lo siguiente.
Names default to here(1);
clear log();
dt = open( "$SAMPLE_DATA/Big Class.jmp" );
// Example "other" source
ex = New Table( "Example",
Add Rows(2),
New Column( "Growth Label", Character, Nominal, Set Values( { "Tall", "Short" } ) ),
New Column( "Height tag", Numeric, Continuous, Set Values( { 67.5, 60 } ) ),
);
dt << Graph Builder(
Size( 517, 447 ),
Show Control Panel( 0 ),
Fit to Window,
Set α Level( 0.05 ),
Variables( X( :weight ), Y( :height ), Color( :sex ) ),
Elements( Points( X, Y, Legend( 3 ) ) ),
SendToReport(
Dispatch(
{},
"height",
ScaleBox,
{Add Ref Line( ex:Height tag[1], "Solid", "Black", ex:Growth Label[1], 1 )} // 2x references to data table( "Example" ) as "ex"
)
)
);La diferencia en la secuencia de comandos anterior es que parte de la información de la línea de referencia ahora se extrae de la tabla de ejemplo que se creó.¿Qué sucede si quisiera agregar la visualización en el script anterior como un script de tabla de datos?Suponiendo que no queremos estar siempre haciendo referencia a otra tabla para los valores, ¿cómo podemos reemplazar las referencias con los valores que representan?La respuesta es la manipulación de expresiones y, aparentemente, parse().
Para leer más sobre la manipulación de expresiones, lea este recurso: https://www.jmp.com/support/help/en/17.0/#page/jmp/expresiones-avanzadas-macros-y-listas.shtml#
Si tuviéramos que agregar la visualización como un script de tabla a Big Class, nuestra ventana de script tendría un código como este.
// Visualization - No references to other data sources
dt << New script( "Vis 1",
Graph Builder(
Size( 517, 447 ),
Show Control Panel( 0 ),
Fit to Window,
Set α Level( 0.05 ),
Variables( X( :weight ), Y( :height ), Color( :sex ) ),
Elements( Points( X, Y, Legend( 3 ) ) ),
SendToReport(
Dispatch(
{},
"height",
ScaleBox,
{Add Ref Line( 67.5, "Solid", "Black", "Tall", 1 )}
)
)
);
);
// Visualization - With references to other data sources
// This will not work, as the data table reference "ex" is undefined
// We could replace ex with data table( "example" ), but that table would need to be open in the background
dt << New script( "Vis 2",
Graph Builder(
Size( 517, 447 ),
Show Control Panel( 0 ),
Fit to Window,
Set α Level( 0.05 ),
Variables( X( :weight ), Y( :height ), Color( :sex ) ),
Elements( Points( X, Y, Legend( 3 ) ) ),
SendToReport(
Dispatch(
{},
"height",
ScaleBox,
{Add Ref Line( ex:Height tag[1], "Solid", "Black", ex:Growth Label[1], 1 )}
)
)
);
);Este es el fruto de mi investigación y experimentación hasta ahora, con un enfoque en parse().Todavía no funciona, ¡pero es un paso en la dirección correcta!
names default to here(1);
clear log();
clear symbols();
// Opening & creating data tables for use
dt = open( "$SAMPLE_DATA/Big Class.jmp" );
ex = New Table( "Example",
Add Rows(2),
New Column( "Growth Label", Character, Nominal, Set Values( { "Tall", "Short" } ) ),
New Column( "Height tag", Numeric, Continuous, Set Values( { 67.5, 60 } ) ),
);
// Variables
graphing = expr( Graph Builder() );
size = "Size( 517, 447 )";
control_panel = "Show Control Panel( 0 )";
fit = "Fit to Window";
a_lvl = "Set α Level( 0.05 )";
vars = "Variables( X( :weight ), Y( :height ), Color( :sex ) )";
eles = "Elements( Points( X, Y, Legend( 3 ) ) )";
str = "SendToReport()";
disp = parse( "Dispatch()" );
curly = "{}";
label = "ex:Growth label[1]";
label2 = "height";
scle = "ScaleBox";
x_axis = "x()";
test_label = "ex:Height tag[1]";
mylabel = "ex:Growth label[1]";
ref_line = parse( "Add Ref Line()" );
insert into( graphing, parse( size ) );
insert into( graphing, parse( control_panel ) );
insert into( graphing, parse( fit ) );
insert into( graphing, parse( a_lvl ) );
insert into( graphing, parse( vars ) );
insert into( graphing, parse( eles ) );
show( graphing ); // Result:graphing = Graph Builder(Size(517, 447), Show Control Panel(0), Fit to Window, Set α Level(0.05), Variables(X(:weight), Y(:height), Color(:sex)), Elements(Points(X, Y, Legend(3))));
// add ref line
insert into( ref_line, eval( parse( test_label ) ) );
insert into( ref_line, "Solid" );
insert into( ref_line, "Black" );
insert into( ref_line, eval( parse( mylabel ) ) );
show( ref_line ); // Result: ref_line = Add Ref Line(67.5, "Solid", "Black", "Tall");
insert into( disp, parse( curley ) );
insert into( disp, eval( parse( mylabel ) ) );
insert into( disp, char( label2 ) );
insert into( disp, parse( scle ) );
insert into( disp, parse( curly ) ); // Note this line! More work needs to be done here
show( disp ); // Result: disp = Dispatch({}, "Tall", "height", ScaleBox, {});La secuencia de comandos anterior está muy ocupada, y después de averiguar el resto de esto, buscaré formas de optimizar reduciendo la cantidad de variables necesarias, ya que esta es una lista bastante completa.
Cerca de la parte inferior de la secuencia de comandos, hay más información en la nota: se debe insertar ref_line en curly ANTES de que se inserte curly en disp. Sería fácil pensar que podrías hacer esto:
insert( curley, ref_line );
Pero, debido a que el contenido de ref_line está contenido en un argumento, no en una función, JMP generará un error.Una vez que se descubra una forma de evitar esto, todo lo demás debería ser fácil.Mi próxima conjetura es probar algo como esto:
// Note: char( ref_line ) will cause JMP to error, because it's an argument
new_parse = expr( parse() );
insert into( new_parse, char( ref_line) );
// Then somehow
eval( insert into( curley, eval expr( eval( new_parse ) ) ) );
Después de aprender cómo insertar un argumento de tipo no carácter en otro argumento, el resto de la función Graph Builder() será fácil de construir. La pieza final será insertar todo como una expresión, en dt << New Script ("Visualización", ); y luego usar eval expr() y otro eval() (?) para hacer que JMP se ejecute con éxito el código e inserte la visualización en dt.
Aquí hay algo interesante que encontré.Al intentar insertar un argumento (no carácter) en otro argumento (carácter), try() ayudó a que el no carácter se convirtiera en una cadena.Sin embargo, cuando probé esto un poco más, los resultados no se pudieron replicar.Además, es bastante difícil insertar algo en esas llaves.
Names default to here(1);
clear log();
// This block demonstrates, at a basic level, what I'm trying to do
printing = Expr( print() );
hello = "hello world";
insert into( printing, hello );
eval( printing );
show( printing ); // Result = printing = Print("hello world");
// Test run 1 - Works
new_parse1 = Parse( "Variable()" );
mytest1 = "X(:height)";
insert into( new_parse1, parse( mytest1 ) );
show( new_parse1, type( mytest1 ) ); // Result: new_parse = Variable(X(:height)); Type(mytest) = "String";
// Test run 2 - Doesn't work
new_parse2 = Parse( "Variable()" );
mytest2 = X(:height); // "Name unresolved"" error! X is not recognized
insert into( new_parse2, parse( mytest2 ) );
show( new_parse2, type( mytest2 ) ); // Intended: new_parse = Variable(X(:height)); Type(mytest) = "String";
// Test run 3 - Works
new_parse3 = Parse( "Variable()" );
try( mytest3 = X(:height) );
insert into( new_parse3, parse( mytest3 ) );
show( new_parse3, type( mytest3 ) ); // Result: new_parse = Variable(X(:height)); Type(mytest) = "String";
// Test run 4 - Doesn't work
curly = "{}";
new_parse4 = Parse( "Variable()" );
x_test = parse( "X()" );
some_list = { "one", "two", "three" };
insert into( x_test, eval( some_list[1] ) );
show( x_test ); // Result: x_test = X("one");
insert into( new_parse4, x_test ); // Containing within try() avoids error, but x_test not added into new_parse3
show( new_parse3 ); // Result: new_parse3 = Variable(); <-- Intended: new_parse3 = Variable(X("one"));
insert into( curly, new_parse4 );
show( curly ); // Intended: new_parse3 = {Variable(X("one"))};
// Other attempts - Doesn't work
variable1 = Variable(X("one"));
variable2 = eval insert( "{^variable1^}" );
variable3 = "{" || char( variable1 ) || "}";Creo que tienes muchas complicaciones adicionales.Creo que algo como esto es lo que estás esperando:
Names default to here(1);
clear log();
// Reference table
// Used to populate data in table script below for dt( big )
dt = New Table( "Example",
Add Rows(2),
New Column( "Growth Label", Character, Set Values( { "Tall", "Short", "Thin" } ) ),
New Column( "Height tag", Numeric, Set Values( { 67.5, 60, 56 } ) ),
New Column( "color", Character, Set Values( { "medium dark green", "medium dark red", "purple" } ) )
);
// Example table
big = open( "$SAMPLE_DATA/Big Class.jmp" );
big << New Column( "Random", Numeric, <<SET each="" value=""></SET>Hola,
Tengo la tarea de crear secuencias de comandos de algunas visualizaciones como secuencias de comandos de tablas.Normalmente esto es sencillo. La parte aproximada son las líneas de referencia que deben hacer referencia a otras fuentes cuando se ejecuta el script.Debido a que las referencias están contenidas en dos funciones que normalmente no aceptan variables externas, descubrir cómo usar manipulaciones de expresiones para insertar estos valores es algo que actualmente está más allá de mi nivel de habilidad. Hay múltiples obstáculos que superar.
- Funciones que no aceptan bien variables externas
- var1 = 1;
var2 = 2;
Dt << Nuevo script( “ejemplo”, print( var1 + var2 ) ); - Tenga en cuenta que las variables se definen a partir del script de la tabla. Este es un requisito, ya que los números estarán referenciados desde una tabla de datos.
- Despacho()
- Para los valores dentro de esto, deben ser valores estáticos y claramente expresados.
- Trabajar con expresiones que no contienen funciones
- ejemplo = expr( Nuevo script() );
título = “prueba”;
insertar en (ejemplo, título); // mostrar(ejemplo) = Nuevo script( “prueba”)
// Más adelante, al insertar columnas en el eje x, como en la línea 22 del ejemplo…
x_empty = expr( X() );
x_cols = { :col1, :col2 };
insertar en (x_empty, x_cols[1]); // errores, JMP no sabe qué es X() - Esto me dice que de alguna manera X() no debe evaluarse, pero aún así permite la inserción de elementos, que es lo que se supone que deben hacer nombres como expr() y expr(), pero no funcionan en este caso.
El script de ejemplo contiene un ejemplo simplificado de lo que quiero lograr. Los títulos y números de la tabla recién generada deben insertarse en el script de la tabla, antes de ejecutar la función para insertarla en Big Class. Tengo un ejemplo básico de esto al final del guión.
Names default to here(1);
clear log();
// Reference table
// Used to populate data in table script below for dt( big )
dt = New Table( "Example",
Add Rows(2),
New Column( "Growth Label", Character, Nominal, Set Values( { "Tall", "Short" } ) ),
New Column( "Height tag", Numeric, Continuous, Set Values( { 67.5, 60 } ) ),
);
// Example table
big = open( "$SAMPLE_DATA/Big Class.jmp" );
// Plain example - vis added as table script * works *
big << New Script( "Example",
Graph Builder(
Size( 534, 456 ),
Show Control Panel( 0 ),
Fit to Window,
Set α Level( 0.05 ),
Variables( X( :weight ), X( :age ), Y( :height ), Color( :sex ) ),
Elements( Points( X, Y, Legend( 4 ) ) ),
SendToReport(
Dispatch(
{},
"height",
ScaleBox,
{Add Ref Line( 67.5, "Dashed", "Medium Dark Green", "Tall", 1 ),
Add Ref Line( 60, "Dashed", "Medium Dark Red", "Short", 1 )}
)
)
)
);
// Needed info for below
vis_x = { :weight, :age };
vis_y = { :height };
// Modified example - vis added as table script * not working *
big << New Script( "Example",
Graph Builder(
Size( 534, 456 ),
Show Control Panel( 0 ),
Fit to Window,
Set α Level( 0.05 ),
Variables( X( vis_x[1] ), X( vis_x[1] ), Y( vis_y[1] ), Color( :sex ) ),
Elements( Points( X, Y, Legend( 4 ) ) ),
SendToReport(
Dispatch(
{},
"height",
ScaleBox,
{Add Ref Line( big:Height tag[1], "Dashed", "Medium Dark Green", big:Growth Label[1], 1 ),
Add Ref Line( big:Height tag[2], "Dashed", "Medium Dark Red", big:Growth Label[2], 1 )}
)
)
)
);
// Example: expression manipulations
var1 = 10; // represents some reference number, from somewhere
var2 = 1; // represents some reference number, from somewhere
expr_test = eval expr( expr(var1) + expr(var2) );
expr_begin = expr( New Script( "Var replacement" ) );
insert into( expr_begin, name expr( expr_test ) );
show( expr_begin );
eval( eval expr( big << expr( name expr( expr_begin ) ) ) ); // Script contains: 10 + 1
/* Notice how the table script "Var replacement" in big doesn't contain var1 & var2,
it contains the values they represent. This is what I want to do. */
close( dt, "No Save" );La búsqueda de "líneas de referencia" produce bastantes resultados en los foros de la comunidad. El ejemplo más cercano que he encontrado, hasta ahora, son los enlaces a continuación.
https://community.jmp.com/t5/Discussions/Is-there-a-way-to-automatically-draw-ref-lines-at-the-peak-of/mp/87721/highlight/false#M38710
https://community.jmp.com/t5/Discussions/Fill-color-for-multiple-reference-lines/mp/273205