Utilizzare la casella di riepilogo per modificare il nome radice di più variabili in un grafico di serie temporaliSalve, 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 costruttore di grafici sono statici. Come posso 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 grafico si trovano all'interno di un'istruzione allocate. Non sono sicuro di cosa si tratti e di 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>Modellazione statistica avanzataRi: Utilizzare la casella di riepilogo per modificare il nome radice di più variabili in un grafico di serie temporaliin realtà, ho risolto questo problema, aggiungendo un'altra casella vlist e aggiungendovi la distribuzione all'interno dello script onchange(.
grazie per il consiglio!
Ri: 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 annidata in lineup2, ma definita nell'istruzione Organize(reparent (Lineup2(ChooseET).
Quando eseguo il mio script, fa quasi tutto ciò che desidero, eliminando la vecchia distribuzione "onchange" ma crea una nuova distribuzione all'esterno del dashboard/applicazione, anziché annidata nella casella Lineup.
Ho allegato lo script completo. Apprezzerei qualsiasi ulteriore approfondimento, non riesco a trovare materiale di riferimento sui comandi reparent/allocate.</CODE></P></LINGO-BODY><LINGO-SUB id="lingo-sub-277091" slang="en-US" mode="NONE">Ri: 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" mode="NONE"><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. Pertanto, JSL ha implementato Add Variable() e Remove Variable() nel 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 JMP, disponibile nel menu Guida, mostrerà la maggior parte se non tutti i messaggi disponibili per una piattaforma.Menu principale > Aiuto > Indice di scripting > Oggetto (campo nell'angolo in alto a sinistra) > Distribuzione.</P>
<P> </P>
<P>Scoprirai che in genere esiste più di un metodo per fare qualcosa utilizzando 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 né 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 avere un segnaposto nel display per questo. Quindi, quando si modifica una variabile, si elimina la distribuzione esistente in quel contenitore, quindi ne si aggiunge una nuova. Ricorda, 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 utilizzando la potenza del LineupBox.
Lineup2 = Lineup Box();
Report3 = Platform(
DataTable1,
Distribution(
Continuous Distribution(
Column( :A04004DD ET_DELTA Ratio )
),
Di seguito è riportata una parte dello script 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 su 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 distribuzioni, la seconda opzione.
Buona fortuna!
Ri: Utilizzare la casella di riepilogo per modificare il nome radice di più variabili in un grafico di serie temporaliÈ fantastico, 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!
Ri: 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 viene eseguito sul tuo tavolo sul mio PC.
L'errore che ricevi potrebbe verificarsi perché non hai utilizzato JSL
curr_TAG = TAG[1];
TAG è il risultato di ListBox << ottieni selezionato ; che restituisce un elenco, è necessario ottenere il primo elemento dell'elenco.
Oh, l'altro problema è che la mia tabella generata utilizzava l'estensione ETARG.Il codice che hai inserito cambia ETARG in ETarg Questa potrebbe essere l'altra fonte di errore.
Lo script ha una riga commentata show(curr_TAG) . Togli i commenti e guarda il log.
Nota che vedrai un paio di righe commentate. Ho creato alcune variabili nella tabella che ho generato per testarlo ieri.
Ri: 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 istruzioni codificate e farò un po' di pulizia come mi hai consigliato una volta che avrò un metodo chiaro su come farlo.
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
Ri: 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 al report Intervalli di date dell'asse X
- Invia agli elementi della legenda del rapporto (o devi mantenerli)
Sembra che tu abbia il tuo TAG iniziale codificato.Quindi ho impostato 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 attorno a GB e, in caso di modifica, rimuovere GB e quindi aggiungere un nuovo GB.
Un paio di commenti: sei sicuro che la tabella dati avrà sempre le colonne PV, LO, UP?È qualcosa che devi verificare?
Come accennato 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)} );
));
);
);
) ;
Ri: 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 già pronti (vedi le schede) e l'azione alla selezione è quella di modificare la scheda visibile. La tua azione selezionata sarebbe quella di rimuovere il "tag" corrente e aggiungere il nuovo tag, immagino che verrebbe fatto utilizzando i messaggi per rimuovere e aggiungere variabili al tuo secondo GraphBuilderBox.

Se modifichi l'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 intraprendere quando viene effettuata una selezione

Ecco lo script per il 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 noto l'indice, viene visualizzata la scheda associata.
Non sapendo se hai nominato il secondo display di GraphBuilder, non posso aiutarti con lo script. Non ho provato la tua applicazione poiché non ho una tabella dati con i nomi delle colonne previsti.
Forse questa non è una novità per te.Cerco solo di darti qualche indizio, per ogni evenienza.
Ri: 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 della serie temporale di più colonne, tutte con quel tag come radice del nome.
Quindi seleziona TAG ABC123 e la serie temporale mostrerà ABC123.ETARG, ABC123.UP, ABC123.LO e ABC123.PV
Ri: Utilizzare la casella di riepilogo per modificare il nome radice di più variabili in un grafico di serie temporali@spudton ,
Esistono 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 il turno, forse un intervallo, quindi rimuoverne alcuni. Il mio punto è se vuoi che il report venga aggiornato con ogni selezione, o magari 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 puoi aggiungere e rimuovere variabili nella casella Graph Builder. oppure potresti aggiungere un filtro locale di Escludi la cui visibilità è Comprimi che cattura tutto tranne le selezioni degli utenti. Queste potrebbero essere opzioni invece di Eval Expr.Quando è stato scritto JSL Companion 2nd Edition, è mancato l'uso di GraphBuilderBox.
Ti suggerisco di creare 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, preferisco un pulsante per avviare un'attività se sono possibili più selezioni.
Non ho letto il tuo codice molto attentamente, ma puoi fare riferimento a una casella di visualizzazione utilizzando lo spazio dei nomi della finestra, magari 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 report e dal comportamento che desideri dalla tua interfaccia utente.