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 kämpfe jedoch damit, wie ich das dynamisch aktualisieren kann.
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 parse 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 verweist der Graph Builder auf 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;Aber die Variablennamen im Graph Builder sind statisch. Wie mache ich das dynamisch? Ich habe versucht, das Listenfeld im Graph Builder zu einem Ausdruck zu machen, aber das funktioniert nicht.
das Listenfeld und der Graph-Generator 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>GrafikSkripterstellungBetreff: Verwenden Sie das Listenfeld, um den Stammnamen mehrerer Variablen in einem Zeitreihendiagramm zu ändernTatsächlich habe ich dieses Problem gelöst, indem ich eine weitere vlist-Box hinzugefügt und die Distribution 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 ändernHi, vielen Dank, das hat einiges geklärt und ich habe in das Buch investiert.
Ich habe die Anwendung zunächst grafisch erstellt, und ich denke, die Distribution ist in lineup2 verschachtelt, aber in der Organize(reparent (Lineup2(ChooseET))-Anweisung definiert.
Wenn ich mein Skript ausführe, macht es fast alles, was ich will, und löscht die alte Distribution „onchange“, aber es erstellt eine neue Distribution außerhalb des Dashboards/der Anwendung, anstatt in der Lineup-Box verschachtelt zu sein.
Ich habe das vollständige Skript beigefügt. 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">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"><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 nicht auf anderen verfügbar. Die GraphBuilder-Plattform ermöglicht es einem Benutzer über die Benutzeroberfläche, per Drag-and-Drop Variablen hinzuzufügen und zu entfernen. Daher hat JSL eine Variable hinzufügen () und eine Variable entfernen () in der GraphBuilderBox implementiert.</P>
<P> </P>
<P>Die Verteilung hat keine solche Schnittstelle, daher gibt es keine Methode zum Hinzufügen und Entfernen von Variablen.Der JMP Scripting Index, der sich im Hilfemenü befindet, zeigt die meisten, wenn nicht alle für eine Plattform verfügbaren Meldungen.Hauptmenü > Hilfe > Scripting-Index > Objekt s (oberes linkes Eckfeld) > Verteilung.</P>
<P> </P>
<P>Sie werden feststellen, dass es normalerweise mehr als eine Methode gibt, um etwas mit JSL zu tun.Ein paar Optionen sind:</P>
<P><STRONG>Möglichkeit</STRONG> : Ändern Sie Ihre Distributionsplattform in einen GraphBuilder, der eine Distribution 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 müssen dafür einen Platzhalter in Ihrer Anzeige haben. 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 sagte, dass es in Ihrem Code Elemente zum Aufräumen gibt. Ich habe nicht alle gereinigt.
Der Code hat einen leeren Container, Lineup2. Wenn Sie Report3 erstellen, verschachtelt in diesem Feld. Eigentlich würde ich es in eine VListBox ändern, da Sie die Leistung der LineupBox nicht nutzen.
Lineup2 = Lineup Box();
Report3 = Platform(
DataTable1,
Distribution(
Continuous Distribution(
Column( :A04004DD ET_DELTA Ratio )
),
Unten ist ein 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 dieses Skript. Es enthält Beispiele für mehrere Funktionen, auf die ich in den Beiträgen zu dieser Diskussion Bezug genommen habe. Es bietet eine Anleitung zum Hinzufügen und Entfernen von Distributionen, die zweite 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 Zeitreihenplot wiederholt und das funktioniert gut.
Ich kann die Syntax nicht ausarbeiten, um die Spalte in der Verteilerbox zu ändern, wenn der TAG-Name geändert wird.
sollte dies auf einem Verteilungsobjekt funktionieren?
Eval( Eval Expr( Dstr3 << Remove Variable( {Expr( Column( dt, curr_TAG || " ET_DELTA Ratio" ) )} ) ) );
Ich habe das vollständige Skript beigefügt.
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 möglicherweise erhalten, liegt daran, dass Sie die JSL nicht verwendet haben
curr_TAG = TAG[1];
TAG ist das Ergebnis von ListBox << get selected ; die eine Liste zurückgibt, müssen Sie das erste Element in der Liste erhalten.
Oh, das andere Problem ist meine generierte Tabelle, die die Erweiterung ETARG verwendet.Der Code, den Sie eingegeben haben, ändert ETARG zu ETarg. Das könnte die andere Fehlerquelle sein.
Das Skript hat eine kommentierte Zeile show(curr_TAG) . Entkommentieren Sie und sehen Sie sich das Protokoll an.
Beachten Sie, dass einige Zeilen auskommentiert sind. Ich habe einige Variablen in der Tabelle erstellt, die ich gestern zum Testen erstellt habe.
Betreff: Verwenden Sie das Listenfeld, um den Stammnamen mehrerer Variablen in einem Zeitreihendiagramm zu ändernHallo, danke nochmal. Ich habe eine Tabelle angehängt, die alle Spalten mit einigen Daten enthält.
Ich werde die fest codierten Anweisungen entfernen und einige Haushaltsarbeiten durchführen, wie Sie es empfohlen haben, sobald ich eine klare Methode habe, wie ich dies tun werde.
Ich habe Ihren Code eingefügt, aber den Fehler "JSL-Argument sollte ein Zeichen im Zugriff oder in der Auswertung von 'Concat' sein" 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 hat ein Handle auf den zweiten GraphBuilder.Ich musste einige Änderungen vornehmen, da ich keine Datentabelle zur Verfügung hatte.
Ihr Code enthält mehrere fest codierte Elemente, ich schlage vor, Sie entfernen, z
- An Datumsbereiche der X-Achse des Berichts senden
- Senden, um Legendengegenstände zu melden (oder Sie müssen sie pflegen)
Es scheint, dass Sie Ihr Start-TAG fest codiert haben.Also setze ich den Startwert curr_TAG auf diesen Wert.Unten zeige ich die JSL zum Entfernen, Hinzufügen von Variablen zur GraphBuilderBox. Ich denke, es könnte eleganter sein, einen Container um gb herum zu haben und bei Änderung gb zu entfernen und dann ein neues gb hinzuzufügen.
Ein paar Anmerkungen: Sind Sie sicher, dass die Datentabelle immer die Spalten PV, LO, UP enthält?Ist das etwas, was Sie überprüfen müssen?
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 der Bericht ändert. In diesem Beispiel sind alle Diagramme vorgefertigt (siehe Registerkarten) und die Aktion bei der Auswahl besteht darin, die sichtbare Registerkarte zu ändern. Ihre On-Select-Aktion wäre, das aktuelle "Tag" zu entfernen und das neue Tag hinzuzufügen. Ich gehe davon aus, dass dies durch Verwenden der Nachrichten zum Entfernen und Hinzufügen von Variablen zu Ihrer 2. 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) wird hervorgehoben und die rote Umrandung zeigt, wo eine Funktion/ein Skript hinzugefügt werden muss, damit die Aktion ausgeführt wird, 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, sodass sobald der Index bekannt ist, die zugehörige Registerkarte angezeigt wird.
Da ich nicht weiß, ob Sie die zweite GraphBuilder-Anzeige benannt haben, kann ich Ihnen mit dem Skript nicht helfen. Ich habe Ihre Anwendung nicht ausprobiert, da ich keine Datentabelle mit erwarteten Spaltennamen habe.
Vielleicht ist das nichts Neues für Sie.Ich versuche nur, Ihnen ein paar Hinweise zu geben, nur für den Fall.
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, dann zeigt die Anwendung das Zeitreihendiagramm mehrerer Spalten an, alle mit diesem Tag als Stamm des Namens.
Wählen Sie also TAG ABC123, 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 ,
Dazu 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 1 Element in Ihrer Liste auswählen und dann die Steuerung verwenden, andere auswählen und möglicherweise einen Bereich gedrückt halten und dann einige entfernen. Mein Punkt ist, ob Sie möchten, dass der Bericht mit jeder Auswahl aktualisiert wird, oder ob Sie vielleicht eine Schaltfläche hinzufügen möchten, sodass der Benutzer nach der Auswahl eine Schaltfläche „Go“, „Rerun“ oder „Do It“ drückt, um die Analysen zu wiederholen.
In Bezug auf den Bericht GraphBuilder können Sie Variablen zur Graph Builder Box hinzufügen und entfernen. oder Sie könnten einen lokalen Filter von Exclude hinzufügen, dessen Sichtbarkeit reduziert ist, der alle außer der Auswahl des Benutzers erfasst. Dies können Optionen anstelle von 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 dies funktionieren könnte.
Wenn der Benutzer nicht nur eine Auswahl treffen kann, bevorzuge ich persönlich eine Schaltfläche zum Starten einer Aufgabe, wenn mehrere Auswahlen möglich sind.
Ich habe Ihren Code nicht sehr genau gelesen, aber Sie können auf eine Anzeigebox verweisen, indem Sie den Fensternamensraum 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.