Bonjour,
J'essaie de tracer des distributions avec une boucle basée sur les critères suivants :
- besoin de tracer uniquement les colonnes avec au moins 1x limite de spécification (LSL ou USL)
- besoin de diviser par arguments une colonne sélectionnée (SplitBy)
J'ai utilisé Eval(EvalExpr()) pour créer l'expression dont j'ai besoin, mais j'ai du mal avec la fonction Where() pour diviser par la colonne sélectionnée.
J'ai extrait la partie du code qui échoue et ajouté une création de table factice au début afin que le problème puisse être répliqué.
il existe 3 options de mes essais qui peuvent être commentées/décommentées pour reproduire le problème dans le code ci-dessous.
Mon objectif est de créer une expression qui appelle correctement la variable "SplitBy" dans Where() comme dans l'option 1 ci-dessous (mais ":CONFIG1" est codé en dur dans l'option 1)
mes tentatives Option 2 et 3 (entre autres...) échouent (extraits de log ci-dessous)
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"Je sais que l'évaluation des expressions est un sujet récurrent sur ce forum, mais j'ai passé beaucoup de temps à essayer de la faire fonctionner et toujours sans succès 
Merci beaucoup d'avance
Prédicateur
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); */
);
);Je crois que cela fonctionnera pour toi
x = Eval Expr(
dis = dt << Distribution(
Continuous Distribution( Column( Expr(MetricCols[i] ))),
Where(as column(SplitBy) == Expr(ColumnSplitBy[j])))
);