Erstellen Sie eine Formel für eine temporäre VariableHallo alle,
Ich bin noch neu im JMP-Scripting. Ich brauche Hilfe beim Erstellen einer Formel, um den Wert als Variable, aber mit eigenem Namen, zu erstellen. Was ich meine, ist wie folgt. Ich möchte also eine Formel erstellen, mit der Spalte 4 unten als Variable für das Verteilungsdiagramm verwendet werden kann.
es ist wie Plastik = 0,424542
Das Problem besteht derzeit darin, dass der Formelname derselbe sein wird, nämlich t4 = :TYPE;:MIN;. Wenn ich also den Mindestwert für Kunststoff im Verteilungsdiagramm darstellen möchte, wird der Mindestwert für Gestein verwendet, da die Formel für Gestein ebenfalls t4 lautet.
Also, wie kann ich die Formel so gestalten, dass der Variablenwert wird?
Kunststoff = :TYPE;:MIN;
Papier = :TYPE;:MIN;
und so weiter, dann kann es bereits eine unabhängige Variable sein. Ich bin wirklich dankbar, wenn jemand dabei helfen kann. Ich habe schon ein paar Stunden im Internet gesucht.

Betreff: Erstellen Sie eine Formel für eine temporäre VariableEs war mein Fehler, ich habe ein „)“ weggelassen.Probieren Sie diesen Code aus
Names Default To Here( 1 );
dt = Current Data Table();
// Only one set of Spec Limits per column can be set,
// therefore split the data into separate columns
// and set the separate limits for each column
dtSplit = dt << Split( Split By( :TYPE ), Split( :NUMERIC_RESULT ), Sort by Column Property );
// Get the names of the generated columns
colList = dtSplit << get column names( string );
// Loop across the columns and create the spec limits for each column
For( i = 1, i <= N Items( colList ), i++,
Eval(
Substitute(
Expr(
__col__ << set property(
"spec limits ",
{LSL( __LSL__ ), USL( __USL__ ), show limits( 1 )}
)
),
Expr( __col__ ), Parse( "dtSplit:" || colList[i] ),
Expr( __LSL__ ),
Eval(
Parse(
"col mean(dtSplit:" || colList[i] || ")-6*col std dev(dtSplit:" || colList[i
] || ")"
)
),
Expr( __USL__ ),
Eval(
Parse(
"col mean(dtSplit:" || colList[i] || ")+6*col std dev(dtSplit:" || colList[i
] || ")"
)
)
)
)
);
// Create a literal string that contains the JSL required to
// generate the Distributions
theExpr = "Distribution(
Arrange in Rows( 1 ),";
theExpr = theExpr || Char(
Substitute(
Expr(
Continuous Distribution(
Column( __col__ ),
Horizontal Layout( 1 ),
Vertical( 0 ),
Normal Quantile Plot( 1 )
)
),
Expr( __col__ ), Parse( "dtSplit:" || colList[1] )
)
);
For( i = 2, i <= N Items( colList ), i++,
theExpr = theExpr || "," || Char(
Substitute(
Expr(
Continuous Distribution(
Column( __col__ ),
Horizontal Layout( 1 ),
Vertical( 0 ),
Normal Quantile Plot( 1 )
)
),
Expr( __col__ ), Parse( "dtSplit:" || colList[i] )
)
);
);
theExpr = theExpr || ");";
// Run the generated code
Eval( Parse( theExpr ) );Betreff: Erstellen Sie eine Formel für eine temporäre VariableHallo Jim,
Hier habe ich die Tabelle angehängt, um den von Ihnen angegebenen Code mit nur einigen Änderungen auszuführen. Wenn Sie das hier geschriebene Skript ausführen, wird das Verteilungsdiagramm nicht automatisch generiert.
Ich habe das Protokoll überprüft und versucht zu debuggen, was daran falsch ist, aber es scheint, als ob ich es nicht finden kann, warum es sich darüber beschwert, dass ein Fehler vorliegt. Für mich sieht es gut aus.
Der Fehler ist wie folgt:
Unerwartetes Ende der Eingabe. Möglicherweise fehlt ein „“,“ oder „)“.
Versucht, Argumente der Funktion „Verteilung“ zu analysieren.
Zeile 2 Spalte 560: ...Normal Quantile Plot(1));►...
Betreff: Erstellen Sie eine Formel für eine temporäre VariableDer von mir bereitgestellte Code sollte auch die Verteilungen generieren.
Können Sie bitte eine Kopie der Datentabelle anhängen, mit der Sie arbeiten, damit ich sehen kann, wo das Problem liegt? ... Wenn Sie sich die Protokolldatei ansehen, sollten Sie auch sehen, wo das Problem liegt.
Betreff: Erstellen Sie eine Formel für eine temporäre VariableHallo Jim,
Ja, es funktioniert für beliebig viele TYPE-Werte in der Spalte, aber wenn ich mit dem Zeichnen des Verteilungsdiagramms beginne, muss ich es immer noch manuell zeichnen.
Ist es möglich, das Verteilungsdiagramm automatisch zeichnen zu lassen, nachdem alle Grenzwerte für alle TYPE-Werte berechnet wurden? Ich habe versucht, das Diagramm manuell zu zeichnen, um es aus dem Skript zu exportieren, aber es scheint, als ob in der Beispieltabelle, die ich hier angegeben habe, alles fest auf den TYPE-Wert festgelegt ist.
Auch der TYPE-Wert kann von Zeit zu Zeit unterschiedlich sein. Daher muss ich die fest codierte Zeile in der JSL vermeiden.
@txnelson
Betreff: Erstellen Sie eine Formel für eine temporäre VariableDer von mir geschriebene Code sollte mit so vielen TYPE-Werten funktionieren, wie er in der Datentabelle findet.Ist dies nicht der Fall, handelt es sich um einen Fehler und der Code muss korrigiert werden.
Betreff: Erstellen Sie eine Formel für eine temporäre VariableDer von mir bereitgestellte Code sollte für so viele TYPE-Werte funktionieren, wie er in der Datentabelle findet.
Betreff: Erstellen Sie eine Formel für eine temporäre VariableHallo Jim,
Ich meine, nachdem alle Grenzwerte berechnet wurden, wird das Verteilungsdiagramm für alle TYPE-Werte zusammen mit dem berechneten Grenzwert direkt dargestellt. Ich denke also darüber nach, dies mit dem Skript zu erreichen, aber wenn ich versuche, das Skript zu exportieren, nachdem ich das gesamte TYP-Verteilungsdiagramm gezeichnet habe, scheint es, als ob alle Typdiagramme nur in der aktuellen Tabelle fest codiert sind.
Das heißt, wenn ich ein neues Element für die Spalte TYPE habe, wird das Verteilungsdiagramm nicht dargestellt. Es werden nur diese 4 Elemente nur in der Typspalte dargestellt.
Ich hoffe, das beantwortet Ihre Frage. Lassen Sie es mich einfach wissen, wenn Sie hierzu weitere Erläuterungen benötigen. Danke!Betreff: Erstellen Sie eine Formel für eine temporäre Variable@mhalwi
Könnten Sie bitte erklären, was Sie mit „ automatisches Plotten für das Verteilungsdiagramm „?Möchten Sie, dass JMP den Plot ausführt, wenn Sie eine neue Datentabelle öffnen?Oder möchten Sie, dass JMP erkennt, wenn auf einem System neue Daten verfügbar sind?
Betreff: Erstellen Sie eine Formel für eine temporäre VariableHallo Jim,
vielen Dank! Deine Methode funktioniert auch super. Gibt es eine Möglichkeit, die Darstellung des Verteilungsdiagramms mithilfe von JSL automatisch durchzuführen, anstatt die Darstellung des Diagramms manuell vorzunehmen?Betreff: Erstellen Sie eine Formel für eine temporäre VariableHallo @julianisch ,
Beide Lösungen funktionieren großartig!! Danke dir!
1 Frage zur Alt-Methode: Ich muss das Diagramm manuell zeichnen, nachdem die Tabelle geteilt wurde. Gibt es eine Methode zum Zeichnen des Verteilungsdiagramms für alle Spalten, da sich der Wert der TYPE-Spalte immer ändert?
Danke nochmal für deine Hilfe!!
Betreff: Erstellen Sie eine Formel für eine temporäre VariableHier ist ein anderer Ansatz für die Ausgabe, die Sie zu generieren versuchen. Er nutzt die Möglichkeit von JMP, Spezifikationsgrenzen als Spalteneigenschaften zu haben, und dass die Verteilungsplattform diese erkennt und innerhalb der Spalte verwendet Plattform
Names Default To Here( 1 );
dt = Current Data Table();
// Only one set of Spec Limits per column can be set,
// therefore split the data into separate columns
// and set the separate limits for each column
dtSplit = dt << Split( Split By( :TYPE ), Split( :NUMERIC_RESULT ), Sort by Column Property );
// Get the names of the generated columns
colList = dtSplit << get column names( string );
// Loop across the columns and create the spec limits for each column
For( i = 1, i <= N Items( colList ), i++,
Eval(
Substitute(
Expr(
__col__ << set property(
"spec limits ",
{LSL( __LSL__ ), USL( __USL__ ), show limits( 1 )}
)
),
Expr( __col__ ), Parse( "dtSplit:" || colList[i] ),
Expr( __LSL__ ),
Eval(
Parse(
"col mean(dtSplit:" || colList[i] || ")-6*col std dev(dtSplit:" || colList[i
] || ")"
)
),
Expr( __USL__ ),
Eval(
Parse(
"col mean(dtSplit:" || colList[i] || ")+6*col std dev(dtSplit:" || colList[i
] || ")"
)
)
)
)
);
// Create a literal string that contains the JSL required to
// generate the Distributions
theExpr = "Distribution(
Arrange in Rows( 1 ),";
theExpr = theExpr || Char(
Substitute(
Expr(
Continuous Distribution(
Column( __col__ ),
Horizontal Layout( 1 ),
Vertical( 0 ),
Normal Quantile Plot( 1 )
)
),
Expr( __col__ ), Parse( "dtSplit:" || colList[1] )
)
);
For( i = 2, i <= N Items( colList ), i++,
theExpr = theExpr || "," || Char(
Substitute(
Expr(
Continuous Distribution(
Column( __col__ ),
Horizontal Layout( 1 ),
Vertical( 0 ),
Normal Quantile Plot( 1 )
)
),
Expr( __col__ ), Parse( "dtSplit:" || colList[i] )
)
);
);
theExpr = theExpr || ";";
// Run the generated code
Eval( Parse( theExpr ) );Betreff: Erstellen Sie eine Formel für eine temporäre VariableHallo @mhalwi ,
Ich verstehe genau, was Sie jetzt tun wollen. Wenn Sie die folgende JSL einfügen, nachdem Sie Ihre Übersichtstabelle erstellt haben, verfügen Sie über Variablen für die LSL und USL, die für jede Typebene benannt sind (vollständiges Skript hier angehängt, LSL USL – Original method.jsl):
For Each Row(Eval(Parse(Concat("LSL_",:Type," = ",Char(lower_limit)))));
For Each Row(Eval(Parse(Concat("USL_",:Type," = ",Char(upper_limit)))));
Wenn Sie nun die Verteilung für jeden Typ aufrufen und Ihre Referenzlinien erstellen, hängen Sie den Typnamen an LSL und USL an. Zum Beispiel im Dispatch für „Papier“:
Dispatch(
{
"Distributions TYPE=Paper",
"NUMERIC_RESULT"},
"1",
ScaleBox,
{Min(-0.6 ), Max( 1.2 ), Inc( 0.001 ), Minor Ticks( 0 ),
Add Ref Line( USL_Paper, Solid, "Medium Dark Red", "", 2 ),
Add Ref Line( LSL_Paper, Solid, "Medium Dark Red", "", 2 )}
)
Das brachte mich jedoch zum Nachdenken.Wären Sie offen für einen etwas anderen Weg, dies zu erreichen? Sie können dies auch tun, indem Sie Ihre ursprüngliche Tabelle aufteilen. Wir können LSL und USL über JSL als Spalteneigenschaften festlegen. Wenn Sie dann Distribution() aufrufen, können die Grenzwerte automatisch dargestellt werden. JSL dafür ist ebenfalls angehängt (LSL USL – Alt method.jsl).
Hilft das?
@julianisch
Betreff: Erstellen Sie eine Formel für eine temporäre VariableHallo alle,
Hallo @uday_guntupalli Und @julianisch ,
Hier habe ich die Beispieltabelle und das JMP-Skript angehängt, damit ihr es ausprobieren und eine Vorstellung davon bekommen könnt, was ich hier erreichen möchte. Ändern Sie einfach den Pfad zur Datentabelle auf Ihrem Computer.
Wie Sie im Skript sehen können, gibt es in der Zusammenfassung für die Datentabelle eine Formel (USL und LSL).
Was ich jetzt also tun muss, ist, eine weitere Formel zu erstellen, die den Wert von USL für Kunststoff usw. annehmen und ihm so zuweisen kann, dass er etwa „Plastic_USL = 0,4“ ergibt. Dann kann ich die Variable (Plastic_USL) verwenden, um mithilfe der sendToReport-Funktion das Kunststoffverteilungsdiagramm darzustellen. Das Gleiche gilt also für die andere Liste der Elemente in der Spalte TYP.
Ich kann die USL-Variable nicht direkt verwenden, denn wenn ich sie verwende, wird nur der zuletzt berechnete USL-Wert, der ROCK ist, verwendet und in allen Diagrammen (Kunststoff, Baumwolle, Papier, Stein) dargestellt. Dann ist die Linie für USL nur für ein Diagramm korrekt und für den Rest falsch.
Ich habe nach einer Möglichkeit gesucht, dies zu tun, komme aber nicht weiter und brauche wirklich Hilfe von euch hier. Eure Hilfe wird hier wirklich geschätzt!
dt = Open ("C:\*\data_table.csv");
Distribution(
Stack( 1 ),
Continuous Distribution(
Column( :NUMERIC_RESULT ),
Horizontal Layout( 1 ),
Vertical( 0 ),
Count Axis( 1 ),
Normal Quantile Plot( 1 )
),
By( :TYPE );
);
Summary(
Group(:TYPE ),
Mean( :NUMERIC_RESULT ),
Std Dev( :NUMERIC_RESULT )
);
New Column( "lower_limit",
Numeric,
Continuous,
Format( "Best", 8 ),
Formula(
LSL = :Name( "Mean(NUMERIC_RESULT)" ) - 6 *:Name( "Std Dev(NUMERIC_RESULT)" )
),
);
New Column( "upper_limit",
Numeric,
Continuous,
Format( "Best", 8 ),
Formula(
USL = :Name( "Mean(NUMERIC_RESULT)" ) + 6 *:Name( "Std Dev(NUMERIC_RESULT)" )
),
);
wait (1);
dr = Fit Group (
Distribution(
Stack( 1 ),
Continuous Distribution(
Column( :NUMERIC_RESULT ),
Horizontal Layout( 1 ),
Vertical( 0 ),
Count Axis( 1 ),
Normal Quantile Plot( 1 )
),
By( :TYPE )
);
SendToReport(Dispatch({"Distributions TYPE=Cotton","NUMERIC_RESULT"},"1",ScaleBox,
{Min( LSL - 1 ), Max( USL + 1 ), Inc( 0.005 ), Minor Ticks( 1 ),
Add Ref Line( LSL, Solid, "Medium Dark Red", "", 2 ),
Add Ref Line( USL, Solid, "Medium Dark Red", "", 2 )}
)
);
SendToReport(
Dispatch(
{
"Distributions TYPE=Paper",
"NUMERIC_RESULT"},
"1",
ScaleBox,
{Min(-0.6 ), Max( 1.2 ), Inc( 0.001 ), Minor Ticks( 0 ),
Add Ref Line( USL, Solid, "Medium Dark Red", "", 2 ),
Add Ref Line( LSL, Solid, "Medium Dark Red", "", 2 )}
)
);
SendToReport(
Dispatch(
{
"Distributions TYPE=Plastic",
"NUMERIC_RESULT"},
"1",
ScaleBox,
{Min( 0.1 ), Max( 0.4 ), Inc( 0.005 ), Minor Ticks( 0 ),
Add Ref Line( USL, Solid, "Medium Dark Red", "", 2 ),
Add Ref Line( LSL, Solid, "Medium Dark Red", "", 2 )}
)
);
SendToReport(
Dispatch(
{
"Distributions TYPE=Rock",
"NUMERIC_RESULT"},
"1",
ScaleBox,
{Min( 0.01 ), Max( 3.5 ), Inc( 0.01 ), Minor Ticks( 0 ),
Add Ref Line( USL, Solid, "Medium Dark Red", "", 2 ),
Add Ref Line( LSL, Solid, "Medium Dark Red", "", 2 )}
)
);
)<<REPORT></REPORT>
Betreff: Erstellen Sie eine Formel für eine temporäre VariableHallo @mhalwi ,
Ich weiß nicht genau, was Sie fragen, aber ich habe zwei Vermutungen, also ist hoffentlich eine richtig!
Erste Vermutung: Versuchen Sie, eine Formel zu erstellen, die eine Spalte mit dem Typ „Text“, dann ein Gleichheitszeichen und dann den Wert in der Spalte „min“ zurückgibt? Mit der folgenden Formel in einer Formelspalte wird dies erreicht:
Concat(:Type," = ",Char(:Min))
und eine Tabelle wie diese zurückgeben:
Ich habe die Beispieltabelle angehängt, falls es hilfreich ist.
Zweite Vermutung: Sie möchten neue Variablen, benannt nach den Zellen in der Spalte „Typ“, auf die Werte in der Spalte „Min“ setzen. Oder anders ausgedrückt: Sie möchten den Text in Spalte 4 der obigen Tabelle auswerten. Wenn Sie danach suchen (und diese Tabelle erstellt haben), können Sie die folgende JSL ausführen:
For Each Row(Eval(Parse(:Column 4)));
Aber diese Kolumne nur zu erstellen, um sie zu bewerten, ist wahrscheinlich nicht der sparsamste Ansatz. Wenn Sie dies versuchen, werden diese Variablen wie folgt festgelegt, ohne dass diese Formelspalte erstellt wird:
For Each Row(Eval(Parse(Concat(:Type," = ",Char(:Min)))))
Ich hoffe, eine dieser beiden Antworten hilft!
@julianisch
Betreff: Erstellen Sie eine Formel für eine temporäre Variable@mhalwi ,
Ich bin mir nicht sicher, ob ich verstehe, was Sie tun wollen. Ich werde jedoch versuchen, es auf der Grundlage dessen zu erklären, was ich verstanden habe.
Unten ist meine Interpretation dessen, was Sie tun möchten. Zeichnen Sie im Wesentlichen eine Verteilung Ihrer Daten auf, um das Minimum Ihres Typs sehen zu können. Ich gehe davon aus, dass die unten gezeigte Grafik dies erreicht.
Wenn dies nicht das ist, was Sie suchen, wären Sie so freundlich, einige Screenshots von dem, was Sie zu tun versuchen – in Excel – zur Verfügung zu stellen, damit die Community Ihnen bei dem, was Sie erreichen möchten, helfen kann?
