Utilizzare la casella di riepilogo per modificare il nome radice di più variabili in un grafico di serie temporaliCiao, sto cercando di dare all'utente la possibilità di scegliere un nome di tag e creare un grafico di serie temporali di più variabili che hanno quel nome di tag come radice.
Tuttavia, sto lottando su come aggiornarlo dinamicamente.
La casella di riepilogo contiene un elenco di tag , quindi le variabili da tracciare avranno quel nome di tag, più un'estensione, .PV, .ETARG, ecc. in questo esempio.

Analizzo la seguente istruzione per generare i nomi delle variabili
vars = {};
str = "Variables(
X( :Time ),
Y( :" || TAG || ".ETARG, Position (1) ),
Y( :" || TAG || ".LO, Position( 1 ) ),
Y( :" || TAG || ".PV, Position( 1 ) ),
Y( :" || TAG || ".UP, Position( 1 ) )
)";
vars = parse(str);quindi il costruttore di grafici fa riferimento a questi, invece di avere tag fissi da tracciare
Eval Expr(
DataTable1<<GRAPH builder=""></GRAPH>
Ho una casella di riepilogo in cui l'utente può scegliere il nome radice delle variabili
ChooseET = List Box( ( ET_TAG_LIST ),
maxSelected( 1 ),
onChange(
TAG = ChooseET << Get Selected;Ma i nomi delle variabili nel generatore di grafici sono statici. Come faccio a rendere questa dinamica? Ho provato a rendere la casella di riepilogo un'espressione all'interno del generatore di grafici, ma non funziona.
la casella di riepilogo e il generatore di grafici si trovano all'interno di un'istruzione di allocazione. Non sono sicuro di cosa sia e quanto sia rilevante.
grazie in anticipo, ecco il codice completo!
JMP App(
Set Name( "Application" ),
Set Description(
"An empty workspace for creating custom applications with one or more windows and scripts"
),
Auto Launch( 1 ),
Snap To Grid( 1 ),
Show Grid( 1 ),
Show Properties( 1 ),
Show Sources( 1 ),
Group By Category( 1 ),
Dashboard Mode( 0 ),
Parameters,
Tables(
DataTable1 = GuiTable(
Set Path( "" ),
Set Label( "Output Table" ),
Set Location( "Current Data Table" ),
Set Invisible( 0 )
)
),
Script(JSL Quote(// This script is executed when the application is run.
// Named objects have been created for the application modules
// (for example, "Module1") and the pre-defined object
// "thisApplication" refers to the application object itself.
// Variables and functions declared here are scoped to the
// Application namespace.
dt = Current data table();
ETSelected = "A04004DD";
TAG = ETSelected;;
vars = {};
str = "Variables(
X( :Time ),
Y( :" || TAG || ".ETARG, Position (1) ),
Y( :" || TAG || ".LO, Position( 1 ) ),
Y( :" || TAG || ".PV, Position( 1 ) ),
Y( :" || TAG || ".UP, Position( 1 ) )
)";
vars = parse(str);
show(vars);
PDChartproperties = "
{Legend Model(
3,
Properties( 0, {Line Color( 4 )}, Item ID( \!"" || TAG ||".ETarg\!", 1 ) ),
Properties( 1, {Line Color( 19 ), Marker Size( 1 )}, Item ID( \!"" || TAG ||".LO\!", 1 ) ),
Properties( 2, {Line Color( 53 )}, Item ID( \!"" || TAG ||".PV\!", 1 ) ),
Properties( 3, {Line Color( 19 ), Marker Size( 1 )},Item ID( \!"" || TAG ||".UP\!", 1 )
)
)}
";
props = parse(PDChartproperties);
show(props);
dt = Current Data Table();
ET_LIST = {};
ET_TAG_List = {};
For( i = N Col( dt ), i >= 1, i--,
ET_col = Column (dt, i) << Get Name ();
If(
(Col N Missing( Column( i ) ) / N Row()) != 1 &
Contains (ET_col, "ETarg"),
Insert Into(ET_LIST, ET_col);
);
);
Show (ET_LIST);
n = N Items( ET_LIST );
For( i = 1, i <= n, i++,
ETARG = ET_LIST[i] ;
NFull = Length(ETARG) ;
ETTAG = Left(ETARG,(NFull-6)) ;
Insert Into(ET_TAG_List, ETTAG);
);
Show(ET_TAG_List);
) ),
Allocate(
Module1 = Plan(
PreAllocate,
Script(JSL Quote(// This script is executed when a new module instance is
// created. The pre-defined object "thisModuleInstance" refers
// to the instance object, but other objects such as boxes and
// scripts have not yet been created. Variables declared here are
// scoped to the ModuleInstance namespace.
// This special function will receive parameters passed to CreateInstance()
OnModuleLoad({},
);
thisModuleInstance << Create Objects;
// After this point your module instance objects have been created
// and can be referred to by name (for example, "Button1").
ColList1Select=Function({this},{selectedIndices},
// This function is called when the List Box selection changes
selectedIndices = this << Get Selected Indices;
);
) ),
Allocate(
DataFilterContext1 = Data Filter Context Box();
Lineup2 = Lineup Box();
Report3 = Platform(
DataTable1,
Distribution(
Continuous Distribution(
Column( :A04004DD ET_DELTA Ratio )
),
SendToReport(
Dispatch(
{"A04004DD ET_DELTA Ratio"},
"1",
ScaleBox,
{Min( -5 ), Max( 5 ), Inc( 0.1 ), Minor Ticks( 0 )}
),
Dispatch(
{"A04004DD ET_DELTA Ratio"},
"Quantiles",
OutlineBox,
{Close( 1 )}
),
Dispatch(
{"A04004DD ET_DELTA Ratio"},
"Summary Statistics",
OutlineBox,
{Close( 1 )}
)
)
)
);
Report1 = Platform(
DataTable1,
Graph builder(
Size( 430, 370 ),
Show Control Panel( 0 ),
Fit to Window( "Maintain Aspect Ratio" ),
Variables(
X( :Time ),
Y( :ZZ ET Metric ),
Y( :A04004DD ET_Pass, Position( 1 ) ),
Y( :A04004DD ET_Pass Ave, Position( 1 ) )
),
Elements( Points( X, Y( 1 ), Y( 2 ), Y( 3 ), Legend( 3 ) ) ),
SendToReport(
Dispatch(
{},
"Time",
ScaleBox,
{Min( 3675484152 ), Max( 3676021620 ),
Interval( "Day" ), Inc( 5 ), Minor Ticks( 0 )}
)
)
)
);
ChooseET = List Box( ( ET_TAG_LIST ),
maxSelected( 1 ),
onChange(
TAG = ChooseET << Get Selected;
If( N Items( TAG ) != 0,
Show( TAG );
);
) );
DataFilter1 = DataTable1 << Data Filter(
Local,
Add Filter(
columns( :Day ),
Display( :Day, Size( 0, 0 ), Height( 0 ) )
)
);
Report2 = Platform(
DataTable1,
gb = Eval(
Eval Expr(
DataTable1<<GRAPH builder=""></GRAPH>GraficaScriptingRe: Utilizzare la casella di riepilogo per modificare il nome radice di più variabili in un grafico di serie temporaliin realtà, ho risolto questo, aggiungendo un'altra casella vlist e aggiungendovi la distribuzione all'interno dello script onchange(.
grazie per il consiglio!
Re: Utilizzare la casella di riepilogo per modificare il nome radice di più variabili in un grafico di serie temporaliCiao, molte grazie, questo ha chiarito alcune cose e ho investito nel libro.
Inizialmente ho creato l'applicazione graficamente e penso che la distribuzione sia nidificata in lineup2, ma definita nell'istruzione Organize(reparent (Lineup2(ChooseET).
Quando eseguo il mio script, fa quasi tutto ciò che voglio, eliminando la vecchia distribuzione "onchange" ma crea una nuova distribuzione al di fuori della dashboard/applicazione, piuttosto che nidificata nella casella Lineup.
Ho allegato lo script completo. Gradirei ulteriori approfondimenti, non riesco a trovare alcun materiale di riferimento sui comandi reparent/allocate.</CODE></P></LINGO-BODY><LINGO-SUB id="lingo-sub-277091" slang="en-US">Re: Utilizzare la casella di riepilogo per modificare il nome radice di più variabili in un grafico di serie temporali</LINGO-SUB><LINGO-BODY id="lingo-body-277091" slang="en-US"><P><A href="https://community.jmp.com/t5/user/viewprofilepage/user-id/18907" target="_blank">@spudton</A> ,</P>
<P> </P>
<P>I messaggi disponibili per una piattaforma JMP potrebbero non essere disponibili su altre. La piattaforma GraphBuilder consente a un utente tramite l'interfaccia utente di trascinare e rilasciare per aggiungere e rimuovere variabili. Quindi, JSL ha implementato Add Variable() e Remove Variable() in GraphBuilderBox.</P>
<P> </P>
<P>La distribuzione non ha tale interfaccia, quindi non esiste un metodo per aggiungere e rimuovere variabili.L'indice di scripting di JMP, che si trova nel menu Guida, mostrerà la maggior parte, se non tutti, i messaggi disponibili per una piattaforma.Menu principale > Aiuto > Indice script > Oggetti (campo in alto a sinistra) > Distribuzione.</P>
<P> </P>
<P>Scoprirai che in genere esiste più di un metodo per fare qualcosa usando JSL.Un paio di opzioni sono:</P>
<P><STRONG>Opzione</STRONG> : cambia la tua piattaforma di distribuzione in un GraphBuilder che crea una distribuzione. Non avrà le stesse opzioni o avrà lo stesso aspetto. Tuttavia è possibile aggiungere e rimuovere variabili</P>
<PRE><CODE class=" language-jsl">gbdist =Graph Builder(
Size( 534, 456 ),
Show Control Panel( 0 ),
Variables( Y( :A04004DD ET_DELTA Ratio ) ),
Elements( Histogram( Y, Legend( 3 ), Counts( 1 ) ) )
);
Opzione : usa un contenitore per la tua distribuzione. È necessario disporre di un segnaposto nel display per questo. Quindi, quando si modifica una variabile, si elimina la distribuzione esistente in quel contenitore, quindi se ne aggiunge una nuova. Ricorda che ho detto che c'erano elementi da ripulire nel tuo codice. Non li ho puliti tutti.
Il codice ha un contenitore vuoto, Lineup2. Se crei Report3, nidificato all'interno di quella casella. In realtà lo cambierei in un VListBox poiché non stai usando la potenza di LineupBox.
Lineup2 = Lineup Box();
Report3 = Platform(
DataTable1,
Distribution(
Continuous Distribution(
Column( :A04004DD ET_DELTA Ratio )
),
Di seguito una parte della sceneggiatura 7_InteractiveDisplays.jsl scritto per Applicazioni complementari JSL del linguaggio di scripting JMP, 2a edizione .
clear globals();
orig_dt = Open( "$SAMPLE_DATA/Fitness.jmp" );
cnt = 0; Chosen Columns={}; //initiate values
//----Refresh display script---------------------------
refresh_script = Expr(
Try(dist_vlist << delete);
If( (cnt > 0 & N Items( Chosen Columns ) >= 1),
show(Chosen Columns);
dist_vlist = VListBox(
orig_dist = orig_dt << Distribution( Column( Eval( Chosen Columns ) ), invisible )
); //end VListBox
result_ob << append( dist_vlist );
) //end If
); //end Expr
//----Action to take for Add-----------------------------
add_script = Expr(
cnt = cnt + 1;
listocols << Append( selcol << Get Selected );
);
//----Action to take for Remove -----------------------------
remove_script= Expr(
cnt = cnt + 1;
listocols << Remove Selected;
);
//_______________________________________________________________________________
//-----Dialog Window layout---------------------------------
dist_win = New Window( "Create Distributions",
H List Box(
selcol = Col List Box( All, width( 100 ), nlines( 6 ) ),
Lineup Box( N Col( 1 ), Spacing( 3 ),
Button Box( "Add Column >>", add_script ),
Button Box( "<< Remove Column", remove_script )
),
// listocols is a Col List Box
listocols = Col List Box( width( 100 ), nlines( 6 ),
OnChange( Chosen Columns = listocols << Get Items;
refresh_script;)
) //end listocols
), //end HListBox
Text Box( " " ),
result_ob = Outline Box( "Current Selections" )
);
So che probabilmente stai lavorando a un'attività con una scadenza. Ma prova questo script. Fornisce esempi di diverse funzionalità a cui ho fatto riferimento nei post di questa discussione. Fornisce una procedura per aggiungere e rimuovere le distribuzioni, la seconda opzione.
Buona fortuna!
Re: Utilizzare la casella di riepilogo per modificare il nome radice di più variabili in un grafico di serie temporaliFantastico, grazie.
Ho ripetuto la sintassi con la trama della mia seconda serie temporale e funziona bene.
Non riesco a elaborare la sintassi per modificare la colonna nella casella di distribuzione quando viene modificato il nome del TAG.
dovrebbe funzionare su un oggetto Distribution?
Eval( Eval Expr( Dstr3 << Remove Variable( {Expr( Column( dt, curr_TAG || " ET_DELTA Ratio" ) )} ) ) );
Ho allegato lo script completo.
Grazie ancora per l'aiuto. Sta quasi affondando!
Re: Utilizzare la casella di riepilogo per modificare il nome radice di più variabili in un grafico di serie temporali@spudton ,
Ho allegato lo script che gira sul tuo tavolo sul mio PC.
L'errore che stai ricevendo potrebbe verificarsi è che non hai utilizzato il JSL
curr_TAG = TAG[1];
TAG è il risultato di ListBox << get selected ; che restituisce un elenco, devi ottenere il primo elemento nell'elenco.
Oh, l'altro problema è che la mia tabella generata utilizzava l'estensione ETARG.Il codice inserito in cahnge ETARG in ETarg Questa potrebbe essere l'altra fonte di errore.
Lo script ha una riga commentata show(curr_TAG) . Rimuovere il commento e guardare il registro.
Nota che vedrai un paio di righe commentate. Ho creato alcune variabili nella tabella che ho generato per testarlo ieri.
Re: Utilizzare la casella di riepilogo per modificare il nome radice di più variabili in un grafico di serie temporaliCiao, grazie ancora. Ho allegato una tabella che contiene tutte le colonne con alcuni dati.
Rimuoverò le dichiarazioni hardcoded e farò un po' di pulizia come mi hai consigliato una volta che avrò un metodo chiaro su come lo farò.
Ho inserito il tuo codice ma ho ricevuto l'errore "l'argomento jsl dovrebbe essere un carattere nell'accesso o nella valutazione di 'Concat'"
saluti
wayne
Re: Utilizzare la casella di riepilogo per modificare il nome radice di più variabili in un grafico di serie temporali@spudton
Ho guardato il tuo codice.Lo script ha un handle per il secondo GraphBuilder.Ho dovuto apportare alcune modifiche, perché non avevo una tabella dati da utilizzare.
Il tuo codice ha diversi elementi hardcoded, ti suggerisco di rimuovere, ad es
- Invia a Intervalli di date dell'asse X del rapporto
- Invia a Segnala oggetti legenda (o devi mantenerli)
Sembra che tu abbia codificato il tuo TAG iniziale.Quindi ho impostato il curr_TAG iniziale su quel valore.Di seguito mostro il JSL da rimuovere, aggiungere variabili al GraphBuilderBox. Penso che potrebbe essere più elegante avere un contenitore intorno a gb, e al cambio rimuovere gb e quindi aggiungere un nuovo gb.
Un paio di commenti, sei sicuro che la tabella dei dati avrà sempre le colonne PV, LO, UP?È qualcosa che devi controllare?
Come affermato in precedenza, esistono più metodi per ottenere lo stesso risultato.Buona fortuna!
curr_TAG = "A04004DD";
ChooseET = List Box( ( ET_TAG_LIST ),
maxSelected( 1 ),
onChange(
TAG = ChooseET << Get Selected;
If( N Items( TAG ) != 0,
Show( TAG );
gbb2 = Report(gb)[GraphBuilderBox(1)];
Eval( EvalExpr(gbb2 << Remove Variable({Expr(column(dt,curr_TAG||".ETARG")), Role("Y"), Position(1)} );
gbb2 << Remove Variable({Expr(column(dt,curr_TAG||".LO")), Role("Y"), Position(1)} );
gbb2 << Remove Variable({Expr(column(dt,curr_TAG||".PV")), Role("Y"), Position(1)} );
gbb2 << Remove Variable({Expr(column(dt,curr_TAG||".UP")), Role("Y"), Position(1)} );
));
curr_TAG = TAG[1];
//show(curr_TAG);
wait(0);
Eval( EvalExpr(gbb2 << Add Variable({Expr(column(dt,curr_TAG||".ETARG")), Role("Y"), Position(1)} );
gbb2 << Add Variable({Expr(column(dt,curr_TAG||".LO")), Role("Y"), Position(1)} );
gbb2 << Add Variable({Expr(column(dt,curr_TAG||".PV")), Role("Y"), Position(1)} );
gbb2 << Add Variable({Expr(column(dt,curr_TAG||".UP")), Role("Y"), Position(1)} );
));
);
);
) ;
Re: Utilizzare la casella di riepilogo per modificare il nome radice di più variabili in un grafico di serie temporali@spudton ,
Di seguito è riportato uno screenshot di un'applicazione con una casella di riepilogo , quando un utente seleziona una variabile, il report cambia. In questo esempio tutti i grafici sono predefiniti (vedere le schede) e l'azione su selesct consiste nel modificare la scheda visibile. La tua azione selezionata sarebbe quella di rimuovere il "tag" corrente e aggiungere il nuovo tag, presumo che sarebbe stato fatto utilizzando i messaggi per rimuovere e aggiungere variabili al tuo secondo GraphBuilderBox.

Se modifichi la tua applicazione da << Esegui a << Modifica,
dovresti vedere l'interfaccia utente di ApplicationBuilder. Il ListBox (cart_lb) è evidenziato e il contorno rosso mostra dove aggiungere una funzione/script per l'azione da eseguire quando viene effettuata una selezione

Ecco lo script per ListBox di questa applicazione
Local({idx, nme, tList},
tlist = (cart_lb << get selected);
if(nitems(tlist) >0,
nme = tlist[1];
//show(nme);
idx = var_tabs << index of tab(nme);
var_tabs << set selected(idx);
//show(idx);
); //end if
); //end Local
Come indicato per questa applicazione, ottengo l'indice dell'elenco. Le schede sono allineate con l'elenco, quindi una volta che l'indice è noto, viene visualizzata la scheda associata.
Non sapendo se hai chiamato il secondo display GraphBuilder, non posso aiutarti con lo script. Non ho provato la tua applicazione poiché non ho una tabella di dati con i nomi delle colonne previsti.
Forse non è una novità per te.Sto solo cercando di darti qualche indizio, per ogni evenienza.
Re: Utilizzare la casella di riepilogo per modificare il nome radice di più variabili in un grafico di serie temporaliGrazie per la risposta.
Non voglio che l'utente debba selezionare più tag. Voglio che scelgano un elemento dall'elenco, quindi l'applicazione visualizza il grafico delle serie temporali di più colonne, tutte con quel tag come radice del nome.
Quindi seleziona TAG ABC123 e le serie temporali visualizzeranno ABC123.ETARG, ABC123.UP, ABC123.LO e ABC123.PV
Re: Utilizzare la casella di riepilogo per modificare il nome radice di più variabili in un grafico di serie temporali@spudton ,
Ci sono diversi metodi per farlo. Il metodo scelto dipende dall'azione prevista per l'interfaccia utente.
Un utente può selezionare 1 elemento nell'elenco, quindi utilizzare il controllo, selezionarne altri e tenere premuto MAIUSC forse un intervallo e quindi rimuoverne alcuni. Il mio punto è se vuoi che il rapporto si aggiorni con ogni selezione, o forse aggiungi un pulsante, quindi una volta selezionato l'utente preme un pulsante Vai o Riesegui o Esegui per ripetere le analisi.
Per quanto riguarda il report GraphBuilder è possibile aggiungere e rimuovere variabili dalla casella Graph Builder. oppure puoi aggiungere un filtro locale di Escludi la cui visibilità è ridotta che cattura tutto tranne le selezioni degli utenti. Queste potrebbero essere opzioni invece di Eval Expr.Quando JSL Companion 2nd Edition è stato scritto, l'uso di GraphBuilderBox è stato mancato.
Ti suggerisco di fare un grafico con i filtri e provare diverse opzioni, per capire come potrebbe funzionare.
Personalmente, a meno che l'utente non possa effettuare una sola selezione, mi piace un pulsante per avviare un'attività se sono possibili selezioni multiple.
Non ho letto il tuo codice molto da vicino, ma puoi fare riferimento a una finestra di visualizzazione usando lo spazio dei nomi della finestra forse window:GraphBuilderBox(2) o stabilire una relazione come (this<< parent) ecc.
Quindi ci sono più opzioni per ottenere ciò che desideri e dipende dall'attuale struttura ad albero del rapporto e dal comportamento che desideri dalla tua interfaccia utente.