Gestern bin ich auf folgenden Thread gestoßen, der mich veranlasst hat, parse() zu untersuchen.
https://community.jmp.com/t5/Discussions/evaluating-a-string-using-a-column-formula/mp/38028
Der Denkprozess ist wie folgt:
- Bei Verwendung von expr() erwartet JMP Funktionen als Argument, keine anderen Argumente. Dazu später mehr.
- Wenn Argumente als Zeichenfolge in einer Variablen gespeichert und dann entweder in ein anderes Argument oder eine andere Funktion eingefügt werden können, hilft dies beim Codieren dessen, was benötigt wird
Hier ist ein Beispiel.
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 )}
)
)
);Das Skript öffnet Big Class.jmp und generiert dann eine Visualisierung mit einer Referenzlinie. Wenn ich Daten aus anderen Quellen für die Visualisierung abrufen möchte, könnte ich das obige Skript wie folgt ändern.
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"
)
)
);Der Unterschied im obigen Skript besteht darin, dass einige der Referenzzeileninformationen jetzt aus der erstellten Beispieltabelle gezogen werden.Was ist, wenn ich die Visualisierung im obigen Skript als Datentabellenskript hinzufügen möchte?Angenommen, wir möchten nicht immer auf eine andere Tabelle für die Werte verweisen, wie können wir die Referenzen durch die Werte ersetzen, die sie darstellen?Die Antwort sind Ausdrucksmanipulationen und scheinbar parse().
Um mehr über Ausdrucksmanipulationen zu erfahren, lesen Sie diese Ressource: https://www.jmp.com/support/help/en/17.0/#page/jmp/advanced-expressions-macros-and-lists.shtml#
Wenn wir die Visualisierung als Tabellenskript zu Big Class hinzufügen würden, hätte unser Skriptfenster Code wie diesen.
// 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 )}
)
)
);
);Dies ist das Ergebnis meiner bisherigen Untersuchungen und Experimente mit Schwerpunkt auf parse().Es funktioniert noch nicht, aber es ist ein Schritt in die richtige Richtung!
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, {});Das obige Skript ist sehr ausgelastet, und nachdem ich den Rest herausgefunden habe, werde ich nach Optimierungsmöglichkeiten suchen, indem ich die Anzahl der erforderlichen Variablen verkleinere, da dies eine ziemlich lange Liste ist.
Am Ende des Skripts finden Sie weitere Informationen zum Hinweis: ref_line muss in Curly eingefügt werden, BEVOR Curly in Disp eingefügt wird. Es wäre leicht zu glauben, dass Sie dies tun könnten:
insert( curley, ref_line );
Da der Inhalt von ref_line jedoch in einem Argument und nicht in einer Funktion enthalten ist, gibt JMP einen Fehler aus.Sobald ein Weg gefunden wurde, sollte alles andere einfach sein.Meine nächste Vermutung ist, so etwas zu versuchen:
// 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 ) ) ) );
Nachdem Sie gelernt haben, wie man ein Nicht-Zeichentyp-Argument in ein anderes Argument einfügt, ist der Rest der Graph Builder()-Funktion einfach zu erstellen. Der letzte Teil besteht darin, alles als Ausdruck in dt << New Script( "Visualization", ); einzufügen und dann eval expr() und ein weiteres eval() (?) zu verwenden, damit JMP erfolgreich ausgeführt wird den Code und fügen Sie die Visualisierung in dt ein.
Hier ist etwas Interessantes, das ich gefunden habe.Beim Versuch, ein Argument (kein Zeichen) in ein anderes Argument (Zeichen) einzufügen, half try() dabei, dass das Nicht-Zeichen eine Zeichenfolge wurde.Doch als ich dies ein bisschen mehr testete, konnten die Ergebnisse nicht repliziert werden.Außerdem ist es ziemlich schwierig, etwas in diese geschweiften Klammern einzufügen.
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 ) || "}";Sie haben eine Menge zusätzlicher Komplikationen, glaube ich.Ich glaube, so etwas erwartest du:
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>Hallo,
Ich habe die Aufgabe, einige Visualisierungen als Tabellenskripte zu skripten.Normalerweise ist das einfach. Der grobe Teil sind die Referenzzeilen, die bei der Ausführung des Skripts auf andere Quellen verweisen müssen.Da die Referenzen in zwei Funktionen enthalten sind, die normalerweise keine Variablen von außen akzeptieren, ist es derzeit etwas, das meine Fähigkeiten übersteigt, herauszufinden, wie man Ausdrucksmanipulationen zum Einfügen dieser Werte verwendet. Es gibt mehrere Hindernisse zu überwinden.
- Funktionen, die externe Variablen nicht gut akzeptieren
- var1 = 1;
var2 = 2;
Dt << Neues Skript( „Beispiel“, print( var1 + var2 ) ); - Beachten Sie, dass die Variablen aus dem Tabellenskript heraus definiert werden. Dies ist eine Voraussetzung, da die Zahlen aus einer Datentabelle referenziert werden.
- Versenden()
- Werte darin müssen statische, klar angegebene Werte sein
- Arbeiten mit Ausdrücken, die keine Funktionen enthalten
- example = expr( New Script() );
Titel = „Test“;
einfügen in (Beispiel, Titel); // show(example) = Neues Skript( „test“ )
// Später beim Einfügen von Spalten in die x-Achse, wie in Zeile 22 des Beispiels…
x_empty = expr( X() );
x_cols = { :col1, :col2 };
einfügen in( x_empty, x_cols[1] ); // Es treten Fehler auf, JMP weiß nicht, was X() ist - Das sagt mir, dass X() irgendwie nicht ausgewertet werden muss, aber dennoch Elementeinfügungen zulassen muss, was Namen wie expr() und expr() tun sollen, aber in diesem Fall nicht funktionieren
Das Beispielskript enthält ein vereinfachtes Beispiel dafür, was ich erreichen möchte. Die Titel und Nummern in der neu generierten Tabelle müssen in das Tabellenskript eingefügt werden, bevor die Funktion zum Einfügen in die große Klasse ausgeführt wird. Ich habe ein einfaches Beispiel dafür am Ende des Skripts.
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" );Die Suche nach „Referenzlinien“ führt in den Community-Foren zu zahlreichen Ergebnissen. Das nächstgelegene Beispiel, das ich bisher gefunden habe, sind die folgenden Links.
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