Ieri ho trovato il seguente thread, che mi ha portato a indagare su parse().
https://community.jmp.com/t5/Discussions/evaluating-a-string-using-a-column-formula/mp/38028
Il processo di pensiero è il seguente:
- Quando si utilizza expr(), JMP prevede funzioni come argomento, non altri argomenti. Ne parleremo più avanti.
- Se gli argomenti possono essere salvati in una variabile come stringa e quindi inseriti in un altro argomento o funzione, questo aiuterà a codificare ciò che è necessario
Ecco un esempio.
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 )}
)
)
);Lo script apre Big Class.jmp e quindi genera una visualizzazione con una linea di riferimento. Quando desidero estrarre dati da altre fonti per la visualizzazione, posso modificare lo script sopra nel seguente.
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 differenza nello script precedente è che alcune delle informazioni sulla riga di riferimento vengono ora estratte dalla tabella di esempio che è stata creata.E se volessi aggiungere la visualizzazione nello script precedente come script di una tabella di dati?Supponendo che non vogliamo fare sempre riferimento a un'altra tabella per i valori, come possiamo sostituire i riferimenti con i valori che rappresentano?La risposta è la manipolazione delle espressioni e, apparentemente, parse().
Per saperne di più sulle manipolazioni delle espressioni, leggi questa risorsa: https://www.jmp.com/support/help/en/17.0/#page/jmp/advanced-expressions-macros-and-lists.shtml#
Se dovessimo aggiungere la visualizzazione come uno script di tabella a Big Class, la nostra finestra di script avrebbe un codice come questo.
// 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 )}
)
)
);
);Questo è il frutto della mia indagine e sperimentazione finora, con un focus su parse().Non funziona ancora, ma è un passo nella giusta direzione!
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, {});Lo script sopra è molto impegnativo e, dopo aver capito il resto, cercherò modi per ottimizzare riducendo il numero di variabili necessarie, poiché questo è un bel elenco.
Nella parte inferiore dello script, ulteriori informazioni sulla nota: ref_line deve essere inserita in curly PRIMA che curly venga inserita in disp. Sarebbe facile pensare che potresti fare questo:
insert( curley, ref_line );
Tuttavia, poiché il contenuto di ref_line è contenuto all'interno di un argomento, non di una funzione, JMP genererà un errore.Una volta trovato un modo per aggirare questo, tutto il resto dovrebbe essere facile.La mia prossima ipotesi è provare qualcosa del genere:
// 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 ) ) ) );
Dopo aver appreso come inserire un argomento di tipo non carattere in un altro argomento, il resto della funzione Graph Builder() sarà semplice da costruire. Il pezzo finale sarà inserire tutto come un'espressione, in dt << New Script( "Visualization", );, e quindi utilizzare eval expr() e un altro eval() (?) per eseguire correttamente JMP il codice e inserire la visualizzazione in dt.
Ecco qualcosa di interessante che ho trovato.Quando si tenta di inserire un argomento (non carattere) in un altro argomento (carattere), try() ha aiutato il non carattere a diventare una stringa.Tuttavia, quando l'ho testato un po' di più, i risultati non potevano essere replicati.Inoltre, quelle parentesi graffe sono piuttosto difficili da inserire in qualsiasi cosa.
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 ) || "}";Hai molte complicazioni in più, credo.Credo che qualcosa del genere sia quello che stai aspettando:
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>Ciao,
Ho il compito di creare script per alcune visualizzazioni come script di tabella.Normalmente questo è semplice. La parte approssimativa sono le linee di riferimento che devono fare riferimento ad altre fonti quando lo script è in esecuzione.A causa dei riferimenti contenuti in due funzioni che normalmente non accettano variabili dall'esterno, scoprire come utilizzare le manipolazioni delle espressioni per inserire questi valori è qualcosa che attualmente va oltre il mio livello di competenza. Ci sono molteplici ostacoli da superare.
- Funzioni che non accettano bene le variabili esterne
- var1 = 1;
var2 = 2;
Dt << Nuovo script( “esempio”, print( var1 + var2 ) ); - Tieni presente che le variabili sono definite dallo script della tabella. Questo è un requisito, poiché i numeri verranno referenziati da una tabella dati.
- Spedizione()
- I valori all'interno di questo devono essere valori statici e chiaramente definiti
- Lavorare con espressioni che non contengono funzioni
- esempio = expr( Nuovo script() );
titolo = “prova”;
inserire in (esempio, titolo); // mostra(esempio) = Nuovo script( “test” )
// Successivamente, quando si inseriscono colonne nell'asse x, come nella riga 22 dell'esempio...
x_vuoto = espressione( X() );
x_col = { :col1, :col2 };
inserisci in(x_empty, x_cols[1]); // errori, JMP non sa cosa sia X() - Questo mi dice che in qualche modo X() deve essere non valutato, ma consentire comunque l'inserimento di elementi, che è ciò che dovrebbero fare nomi come expr() ed expr(), ma non funzionano in questo caso
Lo script di esempio contiene un esempio semplificato di ciò che voglio realizzare. I titoli e i numeri nella tabella appena generata devono essere inseriti nello script della tabella, prima che venga eseguita la funzione per essere inserita in Big Class. Ne ho un esempio di base in fondo allo 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 ricerca di "linee di riferimento" produce parecchi risultati nei forum della comunità. L'esempio più vicino che ho trovato, finora, sono i link seguenti.
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