Skripthilfe für Table Box() innerhalb einer List Box()Hallo alle,
Ich versuche, einen JSL-Code zu schreiben, der Daten aus einer Datentabelle entnimmt und sie grafisch anzeigt, damit der Benutzer zur weiteren Analyse daraus auswählen kann. Was ich gerne erhalten würde, ist so etwas wie eine Mischung aus dem Eigenwertbericht der PCA-Plattform und dem Effektzusammenfassungsbericht der Fit Model Platform. Ich möchte, dass das Bild wie der PCA-Bericht aussieht, aber die Funktionalität (z. B. die Möglichkeit, eine Zeile auszuwählen) des Effektzusammenfassungsberichts aufweist.
PCA-Eigenwertbericht (wie er aussehen soll):

Bericht „Fit Model Effect Summary“ (die Funktionalität, die ich möchte). Auf dieser Plattform kann man eine Zeile im List Box() auswählen und „entfernen“ oder „hinzufügen“ wählen. Ich möchte nichts entfernen oder hinzufügen, aber ich möchte, dass der Benutzer die Zeile auswählen kann (aus der obigen Ausgabe):

Ich habe die Datentabelle angehängt, mit der ich arbeite. Dies ist die „Aktuelle Datentabelle()“ im JSL-Code unten. Der folgende JSL-Code kann mir einen Teil des Weges bringen, aber nicht genau das, was ich will.
Names Default To Here( 1 );
PC_dt = Current Data Table();
PC_n = {};
PC_eigv = {};
PC_per = {};
PC_cump = {};
For( i = 1, i <= N Rows( PC_dt ), i++,
Insert Into( PC_n, PC_dt:"Number"n[i] );
Insert Into( PC_eigv, Round( PC_dt:"Eigenvalue"n[i], 5 ) );
Insert Into( PC_per, Round( PC_dt:"Percent"n[i], 5 ) );
Insert Into( PC_cump, Round( PC_dt:"cumulative Percent"n[i], 5 ) );
);
PC_Rpt_win = New Window( "PC Results",
Outline Box( "Eigenvalues & cumulative Percent",
//List Box(
//List Box(
Table Box(
Number Col Box( "Number", Eval List( PC_n ) ),
Number Col Box( "Eigenvalue", Eval List( PC_eigv ), <<SET format=""></SET>
Mit den auskommentierten Abschnitten erhalte ich folgende Ausgabe des Codes (allerdings ist keine Zeile auswählbar):

Ich weiß wirklich nicht, ob ich den gesamten Pre-Outline-Box-Teil des Codes benötige, in dem ich Listen für die PCs und Eigenwerte usw. erzeuge. Aber es schien mir der logische Weg zu sein, da ich es mit Spalten zu tun habe eine Datentabelle und die Funktionen erfordern Listen. Es funktioniert, auch wenn es nicht nötig ist.
</CODE></P><P> </P><P>Wenn ich einen oder beide der auskommentierten List Box()-Aufrufe in die Table Box() einfüge, erhalte ich Folgendes. Zeilen sind auswählbar, aber es wird nichts angezeigt:</P><P><SPAN class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="DiedrichSchmidt_3-1635336043749.png" style="width: 400px;"><SPAN class="lia-inline-image-display-wrapper" image-alt="DiedrichSchmidt_3-1635336043749.png" style="width: 221px;"><span class="lia-inline-image-display-wrapper" image-alt="DiedrichSchmidt_3-1635336043749.png" style="width: 221px;"><img src="https://us.v-cdn.net/6038925/uploads/images/37045iA319787974999980/DiedrichSchmidt_3-1635336043749.png" role="button" title="DiedrichSchmidt_3-1635336043749.png" alt="DiedrichSchmidt_3-1635336043749.png" /></span></SPAN></SPAN></P><P>Ich bin mir nicht sicher, was ich falsch mache, und der Scripting-Index enthält nur begrenzte Beispiele für die korrekte Verwendung des List Box()-Aufrufs mit einer Table Box(). Ich habe versucht, der Baumstruktur im Berichtsfenster der Plattform „Modell anpassen“ zu folgen, aber es funktioniert nicht.</P><P> </P><P>Zusammenfassend möchte ich Folgendes in meinem Skript korrigieren:</P><OL><LI>Korrigieren Sie das Feld „Plot Col“, sodass es die kumulative Prozentkurve aufweist, wie sie im PC-Bericht angezeigt wird (erstes Bild oben). Dies ist nicht so kritisch wie Punkt 2.</LI><LI>Korrigieren Sie den List Box()-Aufruf rund um die Table Box(), sodass der Benutzer eine Zeile in der List Box auswählen kann, die dann zur weiteren Analyse an eine andere Funktion weitergeleitet wird.</LI></OL><P>Vielen Dank für alle Vorschläge und Hilfe!,</P><P>DS</P></LINGO-BODY><LINGO-LABS id="lingo-labs-430708" slang="en-US" mode="NONE"><LINGO-LABEL>Automatisierung und Skripterstellung</LINGO-LABEL><LINGO-LABEL>Massenanpassung</LINGO-LABEL></LINGO-LABS><LINGO-SUB id="lingo-sub-431611" slang="en-US" mode="NONE">Betreff: Skripthilfe für Table Box() innerhalb einer List Box()</LINGO-SUB><LINGO-BODY id="lingo-body-431611" slang="en-US" mode="NONE"><P>Hier ist eine weitere Möglichkeit, Daten aus Tabellen in einem Bericht und T2 aus einem PLS-Bericht abzurufen:</P>
<P> </P>
<PRE><CODE class=" language-jsl">Names default to here(1);
dt = Open("$Sample_data/Quality Control/Chemical Reactor Process.jmp");
pls = dt << Run Script("Fit PLS (Pro Only)");
//get values for the first column with the name R²Y by searching for display elements that have a
//child header box containing specific values
(pls << XPath("//NumberColBox[NumberColBoxHeader[text()='R²Y']]"))[1] << get as matrix;
//generalize this into a function and then call it for others column headers
getColumn = function({c},(pls << XPath("//NumberColBox[NumberColBoxHeader[text()='" || c || "']]"))[1] << get as matrix);
getColumn("Q²");
getColumn("Y Responses");
//To get T2, you need to send the message to a specific fit within the platform. As Mark mentioned this is tricky because you
//need to send the message to the analysis layer (I've been calling it a scriptable object), but to find the right object you
//navigate the report structure. I like Xpath, so here is how I would get the report (implied with the XPath function),
//navigate to the outline box (picks the first one matching a name), get the scriptable object or analysis layer and then
//send the message to save T2.
firstfit = (((pls << XPath("//OutlineBox[contains(text(),'NIPALS Fit with ')]"))[1]) << Get Scriptable Object) << Save T Square();
firstfit << Save T Square;
//This might better illustrate what is happening
show properties( report(pls)[Outline Box( "Partial Least Squares" )][Outline Box( "NIPALS Fit with 6 Factors Using Fast SVD" )] << get scriptable object );
Betreff: Skripthilfe für Table Box() innerhalb einer List Box()Dieses Problem ergibt sich aus einem allgemeinen Punkt der Verwirrung. Eine JMP-Plattform besteht aus der Analyseschicht und der Berichtsschicht. Die Analyseschicht ist für die Berechnung verantwortlich und reagiert auf die Befehle, die in den roten Dreiecksmenüs angezeigt werden. Die Berichtsschicht ist für die Darstellung von Informationen verantwortlich. Die Berichtsebene ist eine verschachtelte Struktur aus Anzeigefeldern. Sie müssen die Nachricht „T-Quadrat speichern“ an den Analyse-Layer senden, nicht an den Berichts-Layer. Der Verweis auf den Analyse-Layer ist derjenige, der zurückgegeben wird, wenn Sie die Plattform starten. Zum Beispiel,
biv = Current Data Table() << Bivariate( Y( :weight ), X( :height ), Fit Line );
Die Variable biv speichert einen Verweis auf die Plattform oder genauer gesagt auf den Analyse-Layer. Anschließend erhalten Sie mit einer weiteren Meldung einen Verweis auf die zugehörige Berichtsschicht.
bivRep = biv << Report;
Ich hoffe, diese Erklärung klärt Ihre Frage.
Betreff: Skripthilfe für Table Box() innerhalb einer List Box()Hallo @jthi ,
Nochmals vielen Dank für Ihr schnelles Feedback und Ihre Hilfe. Ja, der <
Jetzt ist mein einziges Problem, wie ich T² sparen kann. Jedes Mal, wenn ich versuche, das betreffende Gliederungsfeld über die PCA-Plattform anzusprechen, erhalte ich einen Protokollfehler, der besagt, dass das Anzeigefeld <
Danke!,
DS
Betreff: Skripthilfe für Table Box() innerhalb einer List Box()Zu Punkt 1:
Ich würde vermuten, dass es eine andere/bessere Möglichkeit gibt, dies zu tun, aber ich habe die Meldungen << Lower und << Upper (erfordert die Angabe von Lower) gefunden. Mit << Lower könnten Sie erste Werte aus der kumulativen Spalte abrufen und diese dann auf „Plot Col Box with Lower“ setzen
pcb << Lower(ncb << get as matrix);

Mit Ihrem Code würde es ungefähr so aussehen (Referenzen hinzufügen und diese verwenden):
Mehr sehen... Um Werte zu erhalten:
Manchmal kann es ausreichen, „In Datentabelle umwandeln“ zu verwenden (abhängig von der Plattform und wenn Sie „Nach Variable“ verwenden):

und dann das Tabellenskript aus der resultierenden Tabelle überprüfen:


Manchmal bietet dies eine recht schnelle Möglichkeit, Verweise auf korrekte Anzeigefelder zu erhalten.
Betreff: Skripthilfe für Table Box() innerhalb einer List Box()Hallo @jthi ,
Vergessen Sie den Teil über DModX, der Scripting Index hat mir gezeigt, wie das geht, und es funktioniert wie erwartet. Es gibt ein Beispiel für Save T Square, aber das funktioniert nicht. Ich bleibe dabei. Ich denke, ich muss auf das richtige Gliederungsfeld verweisen.
Danke!,
DS
Betreff: Skripthilfe für Table Box() innerhalb einer List Box()Hallo @jthi ,
Vielen Dank für Ihr schnelles Feedback. Das hatte ich schon früher versucht, aber es war nichts passiert, also habe ich es aufgegeben und mich für eine andere Route entschieden, die aber nirgendwo hinführte. Ich bin zurückgegangen und habe es ausprobiert, und es funktioniert, danke! Die zusätzliche Funktionalität ist hilfreich. Damit war Punkt 2, der wichtiger war, definitiv gelöst. Wenn Sie eine Idee haben, wie Sie Punkt 1 beheben können, wäre das großartig, aber nicht unbedingt erforderlich.
Das hängt damit zusammen, aber vielleicht ein anderer Thread (lassen Sie es mich wissen und ich werde es in einem anderen Thread erneut veröffentlichen).
Wissen Sie, wie man mit JSL die DModX- und T²-Werte von der PCA-Plattform in der Datentabelle speichert? All dies soll versuchen, diesen Prozess zu automatisieren oder zumindest einige der anderen Schritte zu eliminieren und dem Benutzer lediglich die Grundlagen für die Entscheidung über die Anzahl der PCs zu geben, die er dann zum Speichern der DModX- und T²-Formeln verwenden soll.
Danke!,
DS
Betreff: Skripthilfe für Table Box() innerhalb einer List Box()Besteht ein besonderer Bedarf für List Box()? Sie können verwenden << Set Selectable Rows(); um Zeilen im Tabellenfeld auswählbar zu machen und dann zu verwenden << set row change function(Function({this}, ); um der Auswahl eine Funktion hinzuzufügen.
Beispiel aus dem Scripting-Index:
Names Default To Here(1);
New Window("Mountains",
tb = Table Box(
String Col Box("Mountain", {"K2", "Delphi", "Kilimanjaro", "Grand Teton"}),
Number Col Box("Elevation (meters)", {8611, 681, 5895, 4199}),
Plot Col Box("", {8611, 681, 5895, 4199})
)
);
tb << Set Selectable Rows();
tb << set row change function(Function({this}, Print(this << get selected rows)));