Verwenden Sie das Listenfeld, um den Stammnamen mehrerer Variablen in einem Zeitreihendiagramm zu ändernHallo, ich versuche, dem Benutzer die Möglichkeit zu geben, einen Tag-Namen auszuwählen und ein Zeitreihendiagramm mehrerer Variablen zu erstellen, die diesen Tag-Namen als Wurzel haben.
Ich habe jedoch Schwierigkeiten, das dynamisch zu aktualisieren.
Das Listenfeld enthält eine Liste von Tags, dann haben die darzustellenden Variablen diesen Tag-Namen plus eine Erweiterung, in diesem Beispiel .PV, .ETARG usw.

Ich analysiere die folgende Anweisung, um die Variablennamen zu generieren
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);dann referenziert der Graph Builder diese, anstatt feste Tags zum Plotten zu haben
Eval Expr(
DataTable1<<GRAPH builder=""></GRAPH>
Ich habe ein Listenfeld, in dem der Benutzer den Stammnamen der Variablen auswählen kann
ChooseET = List Box( ( ET_TAG_LIST ),
maxSelected( 1 ),
onChange(
TAG = ChooseET << Get Selected;Die Variablennamen im Graph Builder sind jedoch statisch. Wie mache ich das dynamisch? Ich habe versucht, das Listenfeld im Diagrammersteller zu einem Ausdruck zu machen, aber das funktioniert nicht.
Das Listenfeld und der Diagrammersteller befinden sich in einer Allocate-Anweisung. Ich bin mir nicht sicher, was das ist und wie relevant das ist.
Vielen Dank im Voraus, hier ist der vollständige Code!
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>Erweiterte statistische ModellierungBetreff: Verwenden Sie das Listenfeld, um den Stammnamen mehrerer Variablen in einem Zeitreihendiagramm zu ändernTatsächlich habe ich dieses Problem gelöst, indem ich ein weiteres Vlist-Feld hinzugefügt und die Verteilung innerhalb des onchange(-Skripts daran angehängt habe.
Danke für den Hinweis!
Betreff: Verwenden Sie das Listenfeld, um den Stammnamen mehrerer Variablen in einem Zeitreihendiagramm zu ändernHallo, vielen Dank, das hat ein paar Dinge geklärt und ich habe in das Buch investiert.
Ich habe die Anwendung zunächst grafisch erstellt und denke, dass die Verteilung in lineup2 verschachtelt, aber in der Organize(reparent (Lineup2(ChooseET)-Anweisung) definiert ist.
Wenn ich mein Skript ausführe, macht es fast alles, was ich will: Es löscht die alte Distribution „onchange“, erstellt aber eine neue Distribution außerhalb des Dashboards/der Anwendung, anstatt sie im Lineup-Feld zu verschachteln.
Ich habe das vollständige Skript angehängt. Ich würde mich über weitere Einblicke freuen, ich kann kein Referenzmaterial zu den Befehlen „reparent/allocate“ finden.</CODE></P></LINGO-BODY><LINGO-SUB id="lingo-sub-277091" slang="en-US" mode="NONE">Betreff: Verwenden Sie das Listenfeld, um den Stammnamen mehrerer Variablen in einem Zeitreihendiagramm zu ändern</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>Nachrichten, die für eine JMP-Plattform verfügbar sind, sind möglicherweise auf anderen nicht verfügbar. Die GraphBuilder-Plattform ermöglicht einem Benutzer über die Benutzeroberfläche das Hinzufügen und Entfernen von Variablen per Drag & Drop. Daher hat JSL eine Add Variable() und Remove Variable() zur GraphBuilderBox implementiert.</P>
<P> </P>
<P>Die Distribution verfügt über keine solche Schnittstelle, daher gibt es keine Methode zum Hinzufügen und Entfernen von Variablen.Der JMP-Skriptindex im Menü „Hilfe“ zeigt die meisten, wenn nicht alle, für eine Plattform verfügbaren Meldungen an.Hauptmenü > Hilfe > Skriptindex > Objekte (Feld oben links) > Verteilung.</P>
<P> </P>
<P>Sie werden feststellen, dass es normalerweise mehr als eine Methode gibt, mit JSL etwas zu tun.Ein paar Optionen sind:</P>
<P><STRONG>Möglichkeit</STRONG> : Ändern Sie Ihre Verteilungsplattform in einen GraphBuilder, der eine Verteilung erstellt. Es wird nicht die gleichen Optionen haben oder gleich aussehen. Sie können jedoch Variablen hinzufügen und entfernen</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 ) ) )
);
Möglichkeit : Verwenden Sie einen Container für Ihre Verteilung. Sie benötigen dafür einen Platzhalter in Ihrer Anzeige. Wenn Sie dann eine Variable ändern, löschen Sie die vorhandene Verteilung in diesem Container und fügen dann eine neue hinzu. Erinnern Sie sich, dass ich gesagt habe, dass Ihr Code Elemente enthält, die bereinigt werden müssen. Ich habe nicht alle gereinigt.
Der Code hat einen leeren Container, Lineup2. Wenn Sie Report3 erstellen, wird es in diesem Feld verschachtelt. Eigentlich würde ich es in eine VListBox ändern, da Sie nicht die Leistung der LineupBox nutzen.
Lineup2 = Lineup Box();
Report3 = Platform(
DataTable1,
Distribution(
Continuous Distribution(
Column( :A04004DD ET_DELTA Ratio )
),
Unten finden Sie einen Teil des Skripts 7_InteractiveDisplays.jsl geschrieben für JSL-Begleitanwendungen der JMP-Skriptsprache, 2. Auflage .
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" )
);
Ich weiß, dass Sie wahrscheinlich an einer Aufgabe mit einer Deadline arbeiten. Aber versuchen Sie es mit diesem Skript. Es enthält Beispiele für mehrere Funktionen, auf die ich in den Beiträgen zu dieser Diskussion hingewiesen habe. Es bietet eine Anleitung zum Hinzufügen und Entfernen von Distributionen, der zweiten Option.
Viel Glück!
Betreff: Verwenden Sie das Listenfeld, um den Stammnamen mehrerer Variablen in einem Zeitreihendiagramm zu ändernDas ist großartig Danke.
Ich habe die Syntax mit meinem zweiten Zeitreihendiagramm wiederholt und das funktioniert gut.
Ich kann die Syntax zum Ändern der Spalte im Verteilerfeld nicht herausfinden, wenn der TAG-Name geändert wird.
Sollte dies bei einem Distributionsobjekt funktionieren?
Eval( Eval Expr( Dstr3 << Remove Variable( {Expr( Column( dt, curr_TAG || " ET_DELTA Ratio" ) )} ) ) );
Ich habe das vollständige Skript angehängt.
Nochmals vielen Dank für die Hilfe. Es versinkt fast!
Betreff: Verwenden Sie das Listenfeld, um den Stammnamen mehrerer Variablen in einem Zeitreihendiagramm zu ändern@spudton ,
Ich habe das Skript, das auf Ihrem Tisch läuft, auf meinem PC angehängt.
Der Fehler, den Sie erhalten, liegt möglicherweise daran, dass Sie die JSL nicht verwendet haben
curr_TAG = TAG[1];
TAG ist das Ergebnis von ListBox << get selected ; das eine Liste zurückgibt, müssen Sie das erste Element in der Liste abrufen.
Oh, das andere Problem ist, dass meine generierte Tabelle die Erweiterung ETARG verwendet.Der Code, den Sie eingegeben haben, ändert ETARG in ETarg. Das könnte die andere Fehlerquelle sein.
Das Skript verfügt über eine kommentierte Zeile show(curr_TAG) . Kommentieren Sie den Kommentar und schauen Sie sich das Protokoll an.
Beachten Sie, dass einige Zeilen auskommentiert sind. Ich habe einige Variablen in der Tabelle erstellt, die ich gestern erstellt habe, um sie zu testen.
Betreff: Verwenden Sie das Listenfeld, um den Stammnamen mehrerer Variablen in einem Zeitreihendiagramm zu ändernHallo, nochmals vielen Dank. Ich habe eine Tabelle angehängt, die alle Spalten mit einigen Daten enthält.
Sobald ich eine klare Methode habe, wie ich das machen werde, werde ich die fest codierten Anweisungen entfernen und wie von Ihnen empfohlen einige Reinigungsarbeiten durchführen.
Ich habe Ihren Code eingefügt, aber die Fehlermeldung „jsl-Argument sollte Zeichen beim Zugriff oder bei der Auswertung von ‚Concat‘“ erhalten.
Grüße
Wayne
Betreff: Verwenden Sie das Listenfeld, um den Stammnamen mehrerer Variablen in einem Zeitreihendiagramm zu ändern@spudton
Ich habe mir deinen Code angesehen.Das Skript verfügt über ein Handle für den zweiten GraphBuilder.Ich musste einige Änderungen vornehmen, da ich keine Datentabelle zur Verwendung hatte.
Ihr Code enthält mehrere fest codierte Elemente. Ich empfehle Ihnen, sie zu entfernen, z
- An Datumsbereiche der X-Achse des Berichts senden
- An Berichtslegendenelemente senden (oder Sie müssen sie pflegen)
Anscheinend ist Ihr Start-TAG fest codiert.Also habe ich den Startwert curr_TAG auf diesen Wert gesetzt.Unten zeige ich die JSL zum Entfernen und Hinzufügen von Variablen zur GraphBuilderBox. Ich denke, es könnte eleganter sein, einen Container um GB zu haben und bei einer Änderung GB zu entfernen und dann einen neuen GB hinzuzufügen.
Ein paar Kommentare: Sind Sie sicher, dass die Datentabelle immer die Spalten PV, LO und UP enthält?Müssen Sie darauf achten?
Wie bereits erwähnt, gibt es mehrere Methoden, um das gleiche Ergebnis zu erzielen.Viel Glück!
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)} );
));
);
);
) ;
Betreff: Verwenden Sie das Listenfeld, um den Stammnamen mehrerer Variablen in einem Zeitreihendiagramm zu ändern@spudton ,
Unten sehen Sie einen Screenshot einer Anwendung mit einem Listenfeld, in dem ein Benutzer eine Variable auswählt und sich dann der Bericht ändert. In diesem Beispiel sind alle Diagramme vorgefertigt (siehe Registerkarten) und die Aktion bei „select“ besteht darin, die sichtbare Registerkarte zu ändern. Ihre Aktion bei der Auswahl wäre, das aktuelle „Tag“ zu entfernen und das neue Tag hinzuzufügen. Ich gehe davon aus, dass dies durch die Verwendung der Nachrichten zum Entfernen und Hinzufügen von Variablen zu Ihrer zweiten GraphBuilderBox erfolgen würde.

Wenn Sie Ihre Anwendung von << Ausführen auf << Bearbeiten ändern,
Sie sollten die ApplicationBuilder-Benutzeroberfläche sehen. Die ListBox (cart_lb) ist hervorgehoben und der rote Umriss zeigt, wo eine Funktion/ein Skript hinzugefügt werden muss, damit die Aktion ausgeführt werden kann, wenn eine Auswahl getroffen wird

Hier ist das Skript für die ListBox dieser Anwendung
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
Wie für diese Anwendung angegeben, erhalte ich den Index der Liste. Die Registerkarten sind an der Liste ausgerichtet. Sobald der Index bekannt ist, wird die zugehörige Registerkarte angezeigt.
Da ich nicht weiß, ob Sie die zweite GraphBuilder-Anzeige benannt haben, kann ich Ihnen beim Skript nicht helfen. Ich habe Ihre Anwendung nicht ausprobiert, da ich keine Datentabelle mit den erwarteten Spaltennamen habe.
Vielleicht ist das nichts Neues für Sie.Ich versuche nur, Ihnen für alle Fälle ein paar Hinweise zu geben.
Betreff: Verwenden Sie das Listenfeld, um den Stammnamen mehrerer Variablen in einem Zeitreihendiagramm zu ändernDanke für die Antwort.
Ich möchte nicht, dass der Benutzer mehrere Tags auswählen muss. Ich möchte, dass sie ein Element aus der Liste auswählen und die Anwendung dann das Zeitreihendiagramm mehrerer Spalten anzeigt, alle mit diesem Tag als Stamm des Namens.
Wählen Sie also TAG ABC123 aus und die Zeitreihe zeigt ABC123.ETARG, ABC123.UP, ABC123.LO und ABC123.PV an
Betreff: Verwenden Sie das Listenfeld, um den Stammnamen mehrerer Variablen in einem Zeitreihendiagramm zu ändern@spudton ,
Dafür gibt es mehrere Methoden. Welche Methode Sie wählen, hängt von der Aktion ab, die Sie für die Benutzeroberfläche erwarten.
Ein Benutzer kann ein Element in Ihrer Liste auswählen und dann mit der Strg-Taste andere auswählen, bei gedrückter Umschalttaste möglicherweise einen Bereich gedrückt halten und dann einige entfernen. Meine Frage ist, ob der Bericht bei jeder Auswahl aktualisiert werden soll oder ob eine Schaltfläche hinzugefügt werden soll, damit der Benutzer nach der Auswahl auf die Schaltfläche „Los“, „Erneut ausführen“ oder „Ausführen“ klickt, um die Analysen erneut durchzuführen.
Bezüglich des Berichts GraphBuilder können Sie Variablen zur Graph Builder Box hinzufügen und daraus entfernen. Oder Sie könnten einen lokalen Filter „Ausschließen“ hinzufügen, dessen Sichtbarkeit reduziert ist und der alle außer den Benutzerauswahlen erfasst. Dies könnten Optionen anstelle des Eval Expr sein.Als JSL Companion 2nd Edition geschrieben wurde, wurde die Verwendung der GraphBuilderBox vermisst.
Ich schlage vor, dass Sie ein Diagramm mit den Filtern erstellen und verschiedene Optionen ausprobieren, um zu verstehen, wie das funktionieren könnte.
Persönlich gefällt mir eine Schaltfläche zum Starten einer Aufgabe, sofern der Benutzer nicht nur eine Auswahl treffen kann, wenn mehrere Auswahlmöglichkeiten möglich sind.
Ich habe Ihren Code nicht sehr genau gelesen, aber Sie können auf ein Anzeigefeld verweisen, indem Sie den Fenster-Namespace verwenden, z. B. window:GraphBuilderBox(2), oder eine Beziehung wie (this<< parent) usw. herstellen.
Es gibt also mehrere Optionen, um das zu erreichen, was Sie wollen, und es hängt von der aktuellen Baumstruktur des Berichts und dem gewünschten Verhalten Ihrer Benutzeroberfläche ab.