Hallo,
Ich versuche, Verteilungen mit einer Schleife basierend auf den folgenden Kriterien darzustellen:
- Es müssen nur Spalten mit mindestens dem 1-fachen Spezifikationsgrenzwert (LSL oder USL) geplottet werden.
- Es muss eine Aufteilung nach Argumenten aus einer ausgewählten Spalte erfolgen (SplitBy).
Ich habe Eval(EvalExpr()) verwendet, um den Ausdruck zu erstellen, den ich benötige, aber ich habe Probleme mit der Where()-Funktion zum Teilen nach der ausgewählten Spalte.
Ich habe den Teil des Codes extrahiert, der fehlschlägt, und am Anfang eine Dummy-Tabellenerstellung hinzugefügt, damit das Problem repliziert werden kann.
Es gibt drei Optionen meiner Versuche, die kommentiert bzw. unkommentiert werden können, um das Problem im folgenden Code zu reproduzieren.
Mein Ziel ist es, einen Ausdruck zu erstellen, der die Variable „SplitBy“ in Where() ordnungsgemäß aufruft, wie in Option 1 unten (aber „:CONFIG1“ ist in Option 1 fest codiert).
meine Versuche Option 2 und 3 (unter anderem...) schlagen fehl (Protokollauszüge unten)
Option 1:
dis = dt << Distribution(Continuous Distribution(Column("LogNormal 10,1"n)), Where(:CONFIG1 == “1"))
Option 2:
dis = dt << Distribution(Continuous Distribution(Column("LogNormal 10,1"n)), Where(Column("CONFIG1") == "1"))
This Where-clause for data table 'tabletest.jmp' resulted in no rows: Column( "CONFIG1" ) == "1"
Option 3:
dis = dt << Distribution(Continuous Distribution(Column("LogNormal 10,1"n)), Where(":CONFIG1" == "1"))
This Where-clause for data table 'tabletest.jmp' resulted in no rows: ":CONFIG1" == “1"Ich weiß, dass die Ausdrucksauswertung ein wiederkehrendes Thema in diesem Forum ist, aber ich habe viel Zeit damit verbracht, es zum Laufen zu bringen, aber immer noch kein Erfolg 
vielen Dank im Voraus
Prediger
Names Default To Here( 1 );
clear symbols();
Deletesymbols();
//Create table with random distribution
dt = New Table( "tabletest",
Add Rows( 150 ),
New Column( "LogNormal 10,1", Numeric, "Continuous", formula( Random Lognormal( 10, 1 ) ) ),
New Column( "Normal 10,1", Numeric, "Continuous", formula( Random Normal( 10, 1 ) ) ),
New Column( "Gamma 10,1", Numeric, "Continuous", formula( Random Gamma( 10, 1 ) ) ),
New Column( "Normal 10,2", Numeric, "Continuous", formula( Random Gamma( 10, 2 ) ) ),
New Column( "CONFIG1", Character, "Nominal", formula(char(Random Integer( 1, 3 )))),
New Column( "CONFIG2", Character, "Nominal", formula(char(Random Integer( 1, 3 ))));
);
Column( dt, "LogNormal 10,1" ) << set property( "spec limits", {LSL( 0 ), USL( 400000 ), Show Limits( 0 )} );
Column( dt, "Normal 10,1" ) << set property( "spec limits", {LSL( 6 ), USL( 14 ), Show Limits( 0 )} );
Column( dt, "Gamma 10,1" ) << set property( "spec limits", {LSL( 0 ), USL( 40 ), Show Limits( 0 )} );
dt << save( "$Desktop\tabletest.jmp" );
SplitBy = "CONFIG1";
//Get a list from all unique configs
summarize(ColumnSplitBy=by(Column (SplitBy)));
show(ColumnSplitBy);
For( i = N Items( ColumnSplitBy ), i > 0, i--,
If( ColumnSplitBy[i] == "",
Remove From( ColumnSplitBy, i, 1 );
)
);
//Get Column only with limits (At east LSL or USL, I don't care about target)
MetricCols = dt << Get Column Names( numeric, continuous );
Show( MetricCols );
For( i = N Items( MetricCols ), i >= 1, i--,
Q = Column( MetricCols[i] ) << Get Property( "Spec limits" );
Show( Q );
spec_x = Eval List( {Arg( Q, 1 )/*, Arg( Q, 2 ), Arg( Q, 3 )*/} );
Show( spec_x );
If( N Row( Loc( spec_x, Empty() ) ),
Remove From( MetricCols, i )
);
);
k=1;
//Loop to run through all configs
For ( j = 1, j <= N Items( ColumnSplitBy ), j++,
Show( j );
//Loop to run Distribution > Fit ALL > Capability and collect the stats
For( i = 1, i <= N Items( MetricCols ), i++,
Show( i );
////////////////////////////////////////////////////// Option 1: That works well, but :CONFIG1 is hardcoded
x = Eval Expr(
dis = dt << Distribution(
Continuous Distribution( Column( Expr(MetricCols[i] ))),
Where(:CONFIG1 == Expr(ColumnSplitBy[j])))
);
print (x);
Eval (x);
/* ////////////////////////////////////////////////////// Option 2 : That doesn't work
x = Eval Expr(
dis = dt << Distribution(
Continuous Distribution( Column( Expr(MetricCols[i] ))),
Where(Expr(Column(SplitBy)) == Expr(ColumnSplitBy[j])))
);
print (x);
Eval (x); */
/* ////////////////////////////////////////////////////// Option 3 : That doesn't work
x = Eval Expr(
dis = dt << Distribution(
Continuous Distribution( Column( Expr(MetricCols[i] ))),
Where(Expr(":"||SplitBy) == Expr(ColumnSplitBy[j])))
);
print (x);
Eval (x); */
);
);