Hilfe Skripterstellung für ein interaktives Fenster, das bei Benutzerauswahl aktualisiert wirdVerehrte Gäste,
Ich schreibe ein Skript, das Benutzern in meiner Organisation bereitgestellt wird, um einige einfache schnelle Statistiken für den Benutzer durchzuführen, ohne die Verteilungsplattform aufrufen zu müssen. Das Skript ist unten mit einem Screenshot dessen, was ich derzeit habe, dann einer Liste der Dinge, mit denen ich Probleme habe. Die Benutzer werden JMP 16.1 ausführen, ich verwende JMP Pro 16.0. Alle Maschinen sind Windows 10, 64-Bit-Maschinen.
Der beabsichtigte Zweck des Skripts besteht darin, die numerischen Spalten anzuzeigen (vielleicht werde ich mich später mit kategorialen Spalten befassen) und je nachdem, welches Optionsfeld ausgewählt ist, führt es einige einfache Statistiken aus und zeigt die Ergebnisse im selben Fenster mit einer Spalte mit der Bezeichnung Stats an für die Art der berechneten Statistik und Werte für die Ergebnisse dieser Berechnungen. Das Bedienfeld „Ergebnisse“ sollte bei Auswahl des Optionsfelds aktualisiert werden, nachdem die entsprechende Spalte im Bedienfeld „Spalte auswählen“ ausgewählt wurde.
Aktuelles JMP-Skript (zu Ihrer Information, ich teste es mit der bekannten Big Class.jmp-Datei):
Names Default To Here( 1 );
//Clear Symbols();
//the width of the column list box in pixels
lbWidth = 100;
dt = Current Data Table();
//List of statistics to calculate
StatsListA = {"Mean", "Std Dev", "Max", "Min", "Range", "N"};
StatsListB = {"95% quantile", "50% quantile", "5% quantile"};
StatsListC = {};
//Expression to do math
MathA = Expr(
response_col = Column( dt, Eval( Eval Expr( Expr( ycols ) ) ) );
ymean = Col Mean( response_col );
ystdev = Col Std Dev( response_col );
ymin = Col Min( response_col );
ymax = Col Max( response_col );
yrange = ymax - ymin;
yN = Col Number( response_col );
NumResultsA = {ymean, ystdev, ymin, ymax, yrange, yN};
);
//Expresseion for other math
MathB = Expr(
);
ValueDlg = Expr(
nwin = New Window( "GUI for quick stats",
<<RETURN result=""></RETURN>
Das habe ich bisher:

Hier ist die Liste der Dinge, mit denen ich Probleme habe:
- Der Aufruf von Radio Box() listet den lokalen Variablennamen "StatsListA" usw. auf, anstatt die zu berechnenden Statistiken tatsächlich aufzulisten. Beispielsweise sollte hinter dem ersten Optionsfeld die folgende Liste stehen: Mean, Std Dev, Max, Min, Range, N. Dies sollte auch für die StatsListB und StatsListC gelten (die C-Liste habe ich noch nicht definiert). Ich bin mir nicht sicher, wie ich die vordefinierte Liste auswerten soll, die ich oben im JSL-Code erstelle. Ich würde es vorziehen, nicht jedes einzelne Element ausschreiben zu müssen, da ich möglicherweise die Elemente in der Liste ändern möchte und es einfacher ist, die lokale Variable StatsListX zu ändern, anstatt jedes Mal den Aufruf von Radio Box() zu bearbeiten.
- Im Moment würde ich es vorziehen, nicht ALLE Spalten aufzulisten, sondern nur numerisch. Wenn ich die Option in Col List Box() von All auf Numeric (mit oder ohne "") ändere, erhalte ich eine leere Liste von Spalten. Ich kann nicht herausfinden, warum dies geschieht, wenn es nur die numerischen Spalten auflisten sollte, wenn ich diese Option definiert habe.
- Dies ist meiner Meinung nach die schwierigste: Wie bereits erwähnt, möchte ich, dass die Ergebnisse in der Panel-Box "Ergebnisse" mit einer Spalte auf der linken Seite "Stats" aktualisiert werden (die die Statistiken von StatsListX und die Berechnungsergebnisse für diese auflistet Statistiken in der rechten Spalte "Werte". Dies sollte mit jedem Klick auf ein Optionsfeld aktualisiert werden. Wenn Sie also ursprünglich :height betrachteten, aber :weight betrachten wollten, würden Sie :weight auswählen und dann auf eines der Optionsfelder klicken, um die relevante statistische Zusammenfassung zu erhalten. Ich habe versucht, dem hier gezeigten Set-Function-Beispiel zu folgen, war aber erfolglos (ich kenne den Set-Function-Aufruf nicht sehr gut).

Expr() für MathA sollte aufgerufen werden, indem das ursprüngliche Fenster geschlossen und ein neues Fenster mit den Ergebnissen geöffnet wird, aber nachdem ich in den JMP-Diskussionen weiter recherchiert hatte, fand ich heraus, dass man Felder innerhalb eines vorhandenen Fensters aktualisieren kann, was So gehe ich dieses Problem am liebsten an. Ich weiß also, dass die ursprüngliche Codierung am Anfang meines Codes nicht der richtige Code für das ist, was ich beabsichtige.
Jede Hilfe hierzu wird sehr geschätzt.
Vielen Dank!,
DS
SkripterstellungBetreff: Hilfe Skripterstellung für ein interaktives Fenster, das bei Benutzerauswahl aktualisiert wirdDas ist so ordentlich. Vielen Dank für diese Diskussion.
Betreff: Hilfe Skripterstellung für ein interaktives Fenster, das bei Benutzerauswahl aktualisiert wirdHallo alle,
Ich möchte Ihnen für Ihre fortlaufenden Änderungsvorschläge danken. Ich habe einige Änderungen am Skript vorgenommen und die neueste modifizierte Version gefällt mir besser, daher schätze ich die Beiträge anderer wirklich. Das aktualisierte Skript wird am Ende dieser Antwort veröffentlicht. Dieses neue Skript bietet auch zusammenfassende Statistiken für Zeichendatentypen. Ich habe auch das Layout der Panels leicht modifiziert.
@jthi , ich finde Ihre Anregungen sehr gut und habe sie eingearbeitet. Ich mag die farbigen Header-Namen für die Ergebnisstatistik. Auch ähnlich was @ErraticAttack in ihrem Code hatte, habe ich es so gemacht, dass die Statistiken aktualisiert werden, wenn eine neue Spalte ausgewählt wird ODER ein neues numerisches Ergebnis ausgewählt wird. Ich habe zugelassen, dass die Zeichenstatistikergebnisse ihre vertikale Größe ändern, da es viele Ebenen geben kann, wie für die Datentabelle Big Class.jmp. Die kategorialen Statistiken werden auch aktualisiert, wenn zu diesem Spaltentyp gewechselt wird, aber es wird ein Fehler ausgelöst, wenn die Zeichenspalte ausgewählt wird und dann jemand auf eine numerische Statistikoption klickt. Ich habe den Breitenvorschlag beibehalten, damit sich das Fenster nicht ständig in der Breite ändert. Es tut uns leid @ErraticAttack , bin ich an dieser Stelle nicht so vertraut mit der Definition neuer Namensräume und wie Sie den Code geändert haben. Es sieht sehr nützlich aus und ist ein guter Weg, Dinge anzugehen, ich muss nur lernen, wie man es richtig macht.
Ich bin mir sicher, dass es da draußen noch andere Vorschläge gibt, wie man dies verbessern kann, insbesondere die Ästhetik. Wenn ja, posten Sie bitte, aber stellen Sie sicher, dass Sie mich markieren, damit ich weiß, dass es ein Update zu dieser Diskussion gibt. Nochmals vielen Dank an alle für Ihre Verbesserungsvorschläge.
Vielen Dank!,
DS
unten
//GUI for quickly reporting statistics written by D. Schmidt, ver1.5
//Thanks to JMP User community members: jthi, ian_jmp, and ErraticAttach for helpful suggested changes.
Names Default To Here( 1 );
Clear Symbols();
//the width of the column list box in pixels
lbWidth = 217;
dt = Current Data Table();
//dt = Open( "$SAMPLE_DATA/Big Class.jmp" );
//List of statistics to calculate
StatsList1 = {"µ", "σ", "Max", "Min", "Range(Δ)", "N"};
StatsList2 = {"Quantiles", "5%", "25%", "50%", "75%", "95%"};
StatsList3 = {"N", "N Missing", "N 0", "Prop 0", "Prop non-0"};
maxStatCount = Max( N Items( StatsList1 ), N Items( StatsList2 ), N Items( StatsList3 ) );
//RadioBox() arguments
rbArg = Eval List( {Concat Items( StatsList1, ", " ), Concat Items( StatsList2, ", " ), Concat Items( StatsList3, ", " )} );
rbcArg = {"Select for categorical columns"};
//Statistics to Calculate
statMean = Expr( Col Mean( tempCol ) );
statStd = Expr( Col Std Dev( tempCol ) );
statMax = Expr( Col Max( tempCol ) );
statMin = Expr( Col Min( tempCol ) );
statRange = Expr(
Col Max( tempCol ) - Col Min( tempCol )
);
statN = Expr( Col Number( tempCol ) );
statQ95 = Expr(
Col Quantile( tempCol, 0.05 )
);
statQ75 = Expr(
Col Quantile( tempCol, 0.25 )
);
statQ50 = Expr(
Col Quantile( tempCol, 0.5 )
);
statQ25 = Expr(
Col Quantile( tempCol, 0.75 )
);
statQ5 = Expr(
Col Quantile( tempCol, 0.95 )
);
statMiss = Expr(
Col N Missing( tempCol )
);
statZero = Expr(
N Items( Loc( tempCol << get as matrix, 0 ) )
);
statProp0 = Expr( statZero / statN );
statPropn0 = Expr( 1 - statProp0 );
CatStats = Expr(
coltype = tempCol << Get Data type;
If( coltype == "Character",
catdist = dt << Distribution( Nominal Distribution( Column( tempCol ) ), Invisible );
rpt_catdist = catdist << Report;
lvl = rpt_catdist[String Col Box( 1 )] << Get;
Count = rpt_catdist[Number Col Box( 1 )] << Get;
Prob = rpt_catdist[Number Col Box( 2 )] << Get;
SummNMiss = rpt_catdist[List Box( 7 )][2] << Get Text;
SummLvl = rpt_catdist[List Box( 8 )][1] << Get text;
numNMiss = Num( SummNMiss );
numLvl = Num( SummLvl );
catdist << Close Window;
);
Insert Into( lvl, {"N Missing", "N Levels"} );
Insert Into( Count, numNMiss );
Insert Into( Count, numLvl );
);
//List for results
StatList = Eval List( {StatsList1, StatsList2, StatsList3} );
StatListRes1 = Expr(
Eval List( {statMean, statStd, statMax, statMin, statRange, statN} )
);
StatListRes2 = Expr(
Eval List( {., statQ95, statQ75, statQ50, statQ25, statQ5} )
);
StatListRes3 = Expr(
Eval List( {statN, statMiss, statZero, statProp0, statPropn0} )
);
StatListRes = Expr(
Eval List( {StatListRes1, StatListRes2, StatListRes3} )
);
//User window
ValueDlg = Expr(
nwin = New Window( "GUI for quick stats",
<<RETURN result=""></RETURN>
Betreff: Hilfe Skripterstellung für ein interaktives Fenster, das bei Benutzerauswahl aktualisiert wirdHi @jimloughlin ,
Ich denke, das war nur ein Debugging-Code @jthi verwendet hat, als er seine vorgeschlagenen Änderungen an meinem ursprünglichen Code, den ich gepostet habe, bereitgestellt hat. Ich poste ein aktualisiertes, das einige vorgeschlagene Änderungen von anderen Personen berücksichtigt, die an diesem Thread geschrieben haben. Ich werde Sie markieren, wenn ich das aktualisierte Skript poste. Ich habe es mit der Big Class.jmp-Datentabelle gut funktioniert.
Vielen Dank!,
DS
Betreff: Hilfe Skripterstellung für ein interaktives Fenster, das bei Benutzerauswahl aktualisiert wirdIch werfe hier meine zwei Cent ein.Oft ist es am besten, das Skript so weit wie möglich in logisch isolierte Einheiten oder Funktionen aufzuteilen.Zu diesem Zweck finde ich es viel besser, die Logik aus dem Anzeigebaum zu entfernen und die Funktionsdefinitionen so weit wie möglich zu verflachen.
In meiner Beispiellösung unten sehen Sie, dass alle Funktionen auf den Bereich beschränkt sind selbst Namespace und dass die erste Zeile in jeder Funktion den Bereich umfasst selbst Namensraum.In der Praxis habe ich einen Wrapper für die Metaprogrammierung erstellt, der dies automatisch tut, sodass ich die nicht explizit definieren muss selbst Namespace oder enthalten die self = Namensraum( "name" ) line als erstes Argument jeder Funktion.Wenn Sie viele interaktive GUIs erstellen, möchten Sie vielleicht etwas Ähnliches tun, da dies viel Arbeit spart.Dies hat auch den Vorteil, dass das Skript nicht in eine eingeschlossen werden muss Bewertung( Bewertungsausdr( "<CODE>" ) ) Block.
Wenn Sie diesen Weg gehen, finde ich es auch am einfachsten, einen Wrapper für die eingebauten Anzeigeboxen zu erstellen, die die direkt aufrufen können selbst Funktionen und müssen nicht so viel Boiler-Plate in die stecken << Funktion setzen() Mitteilungen.
/* quick stats */
self = New Namespace();
self:tool name = "Quick Stats";
Eval( Eval Expr(
self:initialize = Function( {}, // called before the display tree is generated
self = Namespace( Expr( self << Get Name ) );
self:table = Current Data Table();
self:radio inputs = {
"Mean, Std Dev, Max, Min, Range, N",
"Quantiles: 0.05, 0.25, 0.50, 0.75, 0.95",
"N, N Missing, N Zero, Prop 0, Prop non-0"
};
self:stat list = {
{"Mean", "Std Dev", "Max", "Min", "Range", "N"},
{"5%", "25%", "50%", "75%", "95%"},
{"N", "N Missing", "N Zero", "Prop 0", "Prop non-0"}
};
1
);
self:content = Function( {}, // holds the display tree
self = Namespace( Expr( self << Get Name ) );
self:container = H Splitter Box(
V List Box(
H List Box(
Lineup Box( N Col( 1 ), Spacing( 0 ),
Spacer Box( <<SET auto="" stretching=""></SET>self:window << Update Window;
self:finalize();
) );
self << Get Name;
Betreff: Hilfe Skripterstellung für ein interaktives Fenster, das bei Benutzerauswahl aktualisiert wirdWenn ich statsstart.jcl ausführe, erhalte ich die folgende Fehlermeldung:
Name nicht aufgelöst: tempCol{1} im Zugriff oder Auswertung von 'tempCol' , tempCol/*###*/
Vielleicht, weil ich v13.2.1 verwende?
Betreff: Hilfe Skripterstellung für ein interaktives Fenster, das bei Benutzerauswahl aktualisiert wirdNachdem Sie das Skript weitgehend so ausgeführt haben, wie Sie es möchten, gibt es einige visuelle Dinge, die ich berücksichtigen würde:
- Die Tabellengröße ändert sich und lässt das Fenster etwas „hüpfen“.
- Wenn der Benutzer keine Spalte ausgewählt hat, wird ein Fehler ausgegeben
- Wenn keine Datentabellen geöffnet sind, können Sie die Skriptausführung stoppen und den Benutzer informieren
- Wenn der Benutzer die Spalte in Col List Box ändert, sollten Sie vielleicht entweder die Statistik mit der aktuellen Auswahl von Radio Box neu berechnen ODER die Tabelle leer setzen.
Paar Ideen:
- Für das Bedienfeld „Ergebnisse“. Sie können Set Widths verwenden, um zu verhindern, dass die Tabelle die horizontale Größe ändert, und versteckte Platzhalter String Col Box mit vordefinierter Listengröße, um vertikale Größenänderungen zu verhindern
- Wählen Sie das Feld „Spalten“ aus. Sie können Max Selected(1) hinzufügen, um zu verhindern, dass Benutzer mehrere Spalten auswählen.
- Wählen Sie das Feld „Quick Stats“ aus. Eine Art "Fehlerbehandlung", wenn der Benutzer keine Spalte ausgewählt hat.
Vollständiges Skript mit einigen Änderungen:
Mehr sehen...Names Default To Here( 1 );
//Clear Symbols(); //dont like using this
If(N Items(Get Data Table List()) == 0,
Throw("No datatables open. Stopping...");
stop();
);
//the width of the column list box in pixels
lbWidth = 205;
dt = Current Data Table();
//dt = Open("$SAMPLE_DATA/Big Class.jmp");
//List of statistics to calculate
StatsList1 = {"Mean", "Std Dev", "Max", "Min", "Range", "N"};
StatsList2 = {"Quantiles", "5%", "25%", "50%", "75%", "95%"};
StatsList3 = {"N", "N Missing", "N Zero", "Prop 0", "Prop non-0"};
maxStatCount = Max(N Items(StatsList1), N Items(StatsList2), N Items(StatsList3));
//Statistics to Calculate
statMean = Expr( Col Mean( tempCol ) );
statStd = Expr( Col Std Dev( tempCol ) );
statMax = Expr( Col Max( tempCol ) );
statMin = Expr( Col Min( tempCol ) );
statRange = Expr(
Col Max( tempCol ) - Col Min( tempCol )
);
statN = Expr( Col Number( tempCol ) );
statQ95 = Expr(
Col Quantile( tempCol, 0.05 )
);
statQ75 = Expr(
Col Quantile( tempCol, 0.25 )
);
statQ50 = Expr(
Col Quantile( tempCol, 0.5 )
);
statQ25 = Expr(
Col Quantile( tempCol, 0.75 )
);
statQ5 = Expr(
Col Quantile( tempCol, 0.95 )
);
statMiss = Expr(
Col N Missing( tempCol )
);
statZero = Expr(
N Items( Loc( tempCol << get as matrix, 0 ) )
);
statProp0 = Expr( statZero / statN );
statPropn0 = Expr( 1 - statProp0 );
//RadioBox() argument
rbArg = Eval List( {Concat Items( StatsList1, ", " ), Concat Items( StatsList2, ", " ), Concat Items( StatsList3, ", " )} );
//List for results
StatList = Eval List( {StatsList1, StatsList2, StatsList3} );
StatListRes1 = Expr(
Eval List( {statMean, statStd, statMax, statMin, statRange, statN} )
);
StatListRes2 = Expr(
Eval List( {., statQ95, statQ75, statQ50, statQ25, statQ5} )
);
StatListRes3 = Expr(
Eval List( {statN, statMiss, statZero, statProp0, statPropn0} )
);
StatListRes = Expr(
Eval List( {StatListRes1, StatListRes2, StatListRes3} )
);
//User window
ValueDlg = Expr(
nwin = New Window( "GUI for quick stats",
<<RETURN result=""></RETURN>
Betreff: Hilfe Skripterstellung für ein interaktives Fenster, das bei Benutzerauswahl aktualisiert wirdHi @jthi und @ian_jmp ,
Danke euch beiden für eure tolle Hilfe! Danke für die letzten beiden abschließenden Hinweise @jthi , konnte ich das alphabetische "Problem" des assoziativen Arrays überwinden. Ich mag die Macht der AAs, ich kann sehen, wo sie nützlich sein können, aber ich brauche wegen der Benutzer eine gewisse Ordnung, die aufrechterhalten werden muss.
Ich konnte die Änderungen mit dem Listenvorschlag und Ihrem Vorschlag für das Count Zero-Problem vornehmen, das ich hatte. Vielen Dank! Der Code funktioniert wie erwartet, jetzt muss ich ihn erweitern, um kategoriale Spalten zu erstellen, und dann meine Benutzer befragen, um zu sehen, welche tatsächliche Liste von Statistiken sie benötigen.
Nochmals danke für all deine Hilfe! Der Arbeitscode (zumindest für numerische Spalten) ist unten.
Vielen Dank!,
DS
Names Default To Here( 1 );
Clear Symbols();
//the width of the column list box in pixels
lbWidth = 205;
dt = Current Data Table();
//dt = Open( "$SAMPLE_DATA/Big Class.jmp" );
//List of statistics to calculate
StatsList1 = {"Mean", "Std Dev", "Max", "Min", "Range", "N"};
StatsList2 = {"Quantiles", "5%", "25%", "50%", "75%", "95%"};
StatsList3 = {"N", "N Missing", "N Zero", "Prop 0", "Prop non-0"};
//Statistics to Calculate
statMean = Expr( Col Mean( tempCol ) );
statStd = Expr( Col Std Dev( tempCol ) );
statMax = Expr( Col Max( tempCol ) );
statMin = Expr( Col Min( tempCol ) );
statRange = Expr(
Col Max( tempCol ) - Col Min( tempCol )
);
statN = Expr( Col Number( tempCol ) );
statQ95 = Expr(
Col Quantile( tempCol, 0.05 )
);
statQ75 = Expr(
Col Quantile( tempCol, 0.25 )
);
statQ50 = Expr(
Col Quantile( tempCol, 0.5 )
);
statQ25 = Expr(
Col Quantile( tempCol, 0.75 )
);
statQ5 = Expr(
Col Quantile( tempCol, 0.95 )
);
statMiss = Expr(
Col N Missing( tempCol )
);
statZero = Expr(
N Items( Loc( tempCol << get as matrix, 0 ) )
);
statProp0 = Expr( statZero / statN );
statPropn0 = Expr( 1 - statProp0 );
//RadioBox() argument
rbArg = Eval List( {Concat Items( StatsList1, ", " ), Concat Items( StatsList2, ", " ), Concat Items( StatsList3, ", " )} );
//List for results
StatList = Eval List( {StatsList1, StatsList2, StatsList3} );
StatListRes1 = Expr(
Eval List( {statMean, statStd, statMax, statMin, statRange, statN} )
);
StatListRes2 = Expr(
Eval List( {., statQ95, statQ75, statQ50, statQ25, statQ5} )
);
StatListRes3 = Expr(
Eval List( {statN, statMiss, statZero, statProp0, statPropn0} )
);
StatListRes = Expr(
Eval List( {StatListRes1, StatListRes2, StatListRes3} )
);
//User window
ValueDlg = Expr(
nwin = New Window( "GUI for quick stats",
<<RETURN result=""></RETURN>Betreff: Hilfe Skripterstellung für ein interaktives Fenster, das bei Benutzerauswahl aktualisiert wird1. Aufgrund der Verwendung von Associative Array werden die Statistiken neu geordnet. Sie könnten vielleicht einfach Listen verwenden und die Referenzierung ändern, um Indizes zu verwenden
2. Das Ändern der Berechnung von 0-Werten könnte funktionieren. Sie könnten zum Beispiel Beispiel Loc() mit N Items() verwenden:
statZero = Expr(N Items(Loc(tempCol << get as matrix, 0)));

Betreff: Hilfe Skripterstellung für ein interaktives Fenster, das bei Benutzerauswahl aktualisiert wirdHi @jthi und @ian_jmp ,
Vielen Dank euch beiden für das schnelle Feedback! Deine Vorschläge haben super funktioniert und ich konnte viel mehr Fortschritte machen. Jetzt habe ich Probleme mit nur zwei wahrscheinlich sehr einfachen Dingen, ich füge den aktualisierten Code unten hinzu. Nur zu Ihrer Information, ich habe einige Werte in :height gelöscht und einige Nullen in :height hinzugefügt, um es zu testen
Ausgaben:
- Wenn es die Statistiken auflistet, tut es sie in alphabetischer Reihenfolge, ich möchte die Reihenfolge beibehalten, die ich in meinen Listen definiert habe, ist das möglich?
- Ich versuche, das Verhältnis von Null und Nicht-Null zu berechnen, indem ich zuerst die Anzahl der Nullen zähle. Leider funktioniert es nicht so richtig. Ich kann die Zusammenfassung in ein Expr() einfügen, aber dann bin ich nicht in der Lage, das assoziative Array zu definieren, und ich bekomme nicht die richtigen nachfolgenden Berechnungen. Ich bin mir sicher, dass es einen einfacheren Weg gibt, aber ich konnte in JSL keinen direkten Befehl finden, um nur Nullen zu zählen. Ich habe 5 fehlende Werte und 7 Nullwerte manuell eingegeben. Also sollte die Prop-Nicht-Null 0,8 und die Prop-Null 0,2 sein.
Names Default To Here( 1 );
Clear Symbols();
//the width of the column list box in pixels
lbWidth = 205;
dt = Current Data Table();
//dt = Open( "$SAMPLE_DATA/Big Class.jmp" );
//List of statistics to calculate
StatsListA = {"Mean", "Std Dev", "Max", "Min", "Range", "N"};
StatsListB = {"Quantiles", "5%", "25%", "50%", "75%", "95%"};
StatsListC = {"N", "N Missing", "N Zero", "Prop 0", "Prop non-0"};
//RadioBox() argument
rbArg = Eval List( {Concat Items( StatsListA, ", " ), Concat Items( StatsListB, ", " ), Concat Items( StatsListC, ", " )} );
//Statistics to Calculate
statMean = Expr( Col Mean( tempCol ) );
statStd = Expr( Col Std Dev( tempCol ) );
statMax = Expr( Col Max( tempCol ) );
statMin = Expr( Col Min( tempCol ) );
statRange = Expr(
Col Max( tempCol ) - Col Min( tempCol )
);
statN = Expr( Col Number( tempCol ) );
statQ95 = Expr(
Col Quantile( tempCol, 0.05 )
);
statQ75 = Expr(
Col Quantile( tempCol, 0.25 )
);
statQ50 = Expr(
Col Quantile( tempCol, 0.5 )
);
statQ25 = Expr(
Col Quantile( tempCol, 0.75 )
);
statQ5 = Expr(
Col Quantile( tempCol, 0.95 )
);
statMiss = Expr(
Col N Missing( tempCol )
);<BR /><BR />//Here's where I'm having trouble with the N Zero and proportions zero and non-zero.
Expr(
Summarize( dt, eg = By( tempCol ), em = Count( tempCol ) )
);
PropTemp1 = Expr(
Associative Array( eg, em )
);
statZero = Expr( PropTemp1["0"] );
statProp0 = Expr( statZero / statN );
statPropn0 = Expr( 1 - statProp0 );
maths = Associative Array();
maths["StatListA"] = Associative Array( StatsListA, {statMean, statStd, statMax, statMin, statRange, statN} );
maths["StatListB"] = Associative Array( StatsListB, {., statQ95, statQ75, statQ50, statQ25, statQ5} );
maths["StatListC"] = Associative Array( StatsListC, {statN, statMiss, statZero, statProp0, statPropn0} );
rbOptions = maths << Get Keys;
//User window
ValueDlg = Expr(
nwin = New Window( "GUI for quick stats",
<<RETURN result=""></RETURN>
Nochmals vielen Dank für Ihre Hilfe bisher, und ich hoffe, Sie können mit diesen anderen kleinen Dingen helfen.
Vielen Dank!,
DS
Betreff: Hilfe Skripterstellung für ein interaktives Fenster, das bei Benutzerauswahl aktualisiert wirdZu Punkt 1., und nur ein wenig zur Antwort von hinzufügen @jthi , du kannst tun:
Names Default To Here( 1 );
//the width of the column list box in pixels
lbWidth = 100;
dt = Open("$SAMPLE_DATA/Big Class.jmp");
//List of statistics to calculate
StatsListA = {"Mean", "Std Dev", "Max", "Min", "Range", "N"};
StatsListB = {"95% quantile", "50% quantile", "5% quantile"};
//RadioBox() argument
rbArg = EvalList({ConcatItems(StatsListA, ", "), ConcatItems(StatsListB, ", ")});
//Window
New Window( "GUI for quick stats",
Panel Box( "Select Columns", ColListData = Col List Box( dt, all, <<SET data="https://community.jmp.com/" type=""></SET>
Betreff: Hilfe Skripterstellung für ein interaktives Fenster, das bei Benutzerauswahl aktualisiert wirdIch habe einige schnelle Tests durchgeführt und das Skript angehängt. Es hat mögliche Ideen, wie Sie dies angehen, aber möglicherweise nicht die besten Lösungen.
1. Umgang mit assoziativen Arrays und Ausdrücken.
2. Musste dafür eine seltsame Syntax verwenden ColListData = Col List Box(dt, All, <
3. Set Function handhabt dies mit Evals.
Das beigefügte Skript gibt die beste Vorstellung davon, wie ich das vorerst angegangen bin.
