Hier, j'ai trouvé le fil suivant, ce qui m'a amené à enquêter sur parse().
https://community.jmp.com/t5/Discussions/evaluating-a-string-using-a-column-formula/mp/38028
Le processus de réflexion est le suivant :
- Lors de l'utilisation de expr(), JMP attend des fonctions comme argument, et non d'autres arguments. Plus à ce sujet plus tard.
- Si les arguments peuvent être enregistrés dans une variable sous forme de chaîne, puis placés dans un autre argument ou une fonction, cela aidera à coder ce qui est nécessaire
Voici un exemple.
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 )}
)
)
);Le script ouvre Big Class.jmp, puis génère une visualisation avec une ligne de référence. Lorsque je souhaite extraire des données d'autres sources pour la visualisation, je peux modifier le script ci-dessus comme suit.
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 différence dans le script ci-dessus est que certaines des informations de ligne de référence sont maintenant extraites de l'exemple de table qui a été créé.Et si je voulais ajouter la visualisation dans le script ci-dessus en tant que script de table de données ?En supposant que nous ne voulions pas toujours faire référence à une autre table pour les valeurs, comment pouvons-nous remplacer les références par les valeurs qu'elles représentent ?La réponse est des manipulations d'expressions et, apparemment, parse().
Pour en savoir plus sur les manipulations d'expressions, lisez cette ressource : https://www.jmp.com/support/help/en/17.0/#page/jmp/advanced-expressions-macros-and-lists.shtml#
Si nous devions ajouter la visualisation en tant que script de table à Big Class, notre fenêtre de script aurait un code comme celui-ci.
// 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 )}
)
)
);
);C'est le fruit de mes recherches et de mes expérimentations jusqu'à présent, en mettant l'accent sur parse().Cela ne fonctionne pas encore, mais c'est un pas dans la bonne direction !
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, {});Le script ci-dessus est très chargé, et après avoir compris le reste, je chercherai des moyens d'optimiser en réduisant le nombre de variables nécessaires, car c'est toute une liste.
Près du bas du script, plus d'informations sur la note : ref_line doit être inséré dans curly AVANT que curly ne soit inséré dans disp. Il serait facile de penser que vous pourriez faire ceci :
insert( curley, ref_line );
Mais comme le contenu de ref_line est contenu dans un argument et non dans une fonction, JMP générera une erreur.Une fois qu'un moyen est trouvé autour de cela, tout le reste devrait être facile.Ma prochaine supposition est d'essayer quelque chose comme ceci:
// 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 ) ) ) );
Après avoir appris à insérer un argument de type non-caractère dans un autre argument, le reste de la fonction Graph Builder() sera simple à construire. La dernière pièce consistera à tout insérer en tant qu'expression, dans dt << New Script( "Visualization", );, puis à utiliser eval expr() et un autre eval() (?) pour que JMP s'exécute avec succès le code et insérez la visualisation dans dt.
Voici quelque chose d'intéressant que j'ai trouvé.Lorsque vous essayez d'insérer un argument (non-caractère) dans un autre argument (caractère), try () a aidé le non-caractère à devenir une chaîne.Pourtant, lorsque j'ai testé cela un peu plus, les résultats n'ont pas pu être reproduits.De plus, ces accolades sont assez difficiles à insérer.
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 ) || "}";Vous avez beaucoup de complications supplémentaires, je crois.Je crois que quelque chose comme ça est ce que vous attendez:
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>Bonjour,
J'ai pour tâche de scripter certaines visualisations sous forme de scripts de table.Normalement, c'est simple. La partie approximative concerne les lignes de référence qui doivent faire référence à d'autres sources lorsque le script est en cours d'exécution.Étant donné que les références sont contenues dans deux fonctions qui n'acceptent normalement pas les variables de l'extérieur, découvrir comment utiliser les manipulations d'expressions pour insérer ces valeurs dépasse actuellement mon niveau de compétence. Il y a de multiples obstacles à surmonter.
- Fonctions qui n'acceptent pas bien les variables extérieures
- var1 = 1 ;
var2 = 2 ;
Dt << Nouveau script( "exemple", print( var1 + var2 ) ); - Notez que les variables sont définies hors du script de table. Il s'agit d'une exigence, car les chiffres seront référencés à partir d'un tableau de données.
- Expédition()
- Pour les valeurs à l'intérieur de ceci, elles doivent être des valeurs statiques et clairement énoncées.
- Travailler avec des expressions qui ne contiennent pas de fonctions
- exemple = expr( Nouveau Script() );
titre = « test » ;
insérer dans( exemple, titre ); // show(exemple) = Nouveau script( "test" )
// Plus tard lors de l'insertion de colonnes dans l'axe des x, comme à la ligne 22 de l'exemple…
x_empty = expr( X() );
x_cols = { :col1, :col2 };
insérer dans( x_empty, x_cols[1] ); // Erreurs, JMP ne sait pas ce qu'est X() - Cela me dit que d'une manière ou d'une autre, X() doit être non évalué, mais toujours autoriser les insertions d'éléments, ce que les noms expr() et expr() sont censés faire, mais ils ne fonctionnent pas dans ce cas.
L'exemple de script contient un exemple simplifié de ce que je souhaite accomplir. Les titres et les numéros du tableau nouvellement généré doivent être insérés dans le script du tableau, avant que la fonction ne soit exécutée pour être insérée dans Big Class. J'en ai un exemple basique au bas du script.
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 recherche de « lignes de référence » donne de nombreux résultats sur les forums communautaires. L’exemple le plus proche que j’ai trouvé jusqu’à présent sont les liens ci-dessous.
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