Meilleure façon d'écrire une formule avec une référence de colonne potentiellement manquanteJ'ai un script qui crée une formule à partir du contenu d'un objet. Dans certains cas, la valeur de la colonne qui remplit l'objet est ignorée. Par exemple, `N Items(yVars) == 0`. Comment faire pour que la formule s'exécute sans référence à la colonne si celle-ci est vide ?
Le cas ci-dessous est excessivement complexe : je vérifie la présence d’une entrée et j’utilise une instruction If() pour créer des actions alternatives.
If( N Items( yVars ) == 0,
Data Table( "HIRP" ) << New Column( "Average PTC",
Numeric,
"Continuous",
Format( "Best", 12 ),
Formula(
Col Mean(
Col Maximum( :Power, :Heater, :HD_NUM ),
:Heater,
:WAFER_SUBSTRATE_LOT_ID_IDX
)
)
),
Eval(
Eval Expr(
Data Table( "HIRP" ) << New Column( "Average PTC",
Numeric,
"Continuous",
Format( "Best", 12 ),
Formula(
Col Mean(
Col Maximum( :Power, :Heater, :HD_NUM ),
:Heater,
Expr(
Name Expr( As Column( Divider ) )
)
)
)
)
)
)
);
Automatisation et scriptageRe: Meilleure façon d'écrire une formule avec une référence de colonne potentiellement manquanteVoici une solution :
//first a table to add columns to
Names default to here(1);
dt = New Table( "Test Table",
Add Rows( 2 ),
New Column( "a", Numeric, "Continuous", Format( "Best", 12 ), Set Values( [1, 2] ) )
);
//this one does create a column
if(!Contains(dt << get column names("string"), "b"),
dt << New Column( "b", Numeric, "Continuous", Format( "Best", 12 ), Set Values( [3, 4] ) )
);
//this does not since b already exists
if(!Contains(dt << get column names("string"), "b"),
dt << New Column( "b", Numeric, "Continuous", Format( "Best", 12 ), Set Values( [5, 6] ) )
);
Re: Meilleure façon d'écrire une formule avec une référence de colonne potentiellement manquanteY a-t-il une raison particulière de ne pas procéder comme vous le faites actuellement ? Si la référence de colonne est vide, ne l'ajoutez pas à la formule.
Votre méthode n'a rien de complexe et elle est facile à lire et à comprendre. Vous pourriez utiliser une instruction « si » pour définir la formule, ce qui réduirait légèrement les répétitions. J'utiliserais soit cette méthode, soit la vôtre (si j'ai bien compris votre question).
Names Default To Here(1);
// myvar = 1;
dt = Open("$SAMPLE_DATA/Big Class.jmp");
newcol = dt << New Column("Test", Numeric, Continuous);
If(Is Missing(myvar),
newcol << Set Formula(
:height/:weight
);
,
newcol << Set Formula(
:weight/:height
)
);
Voici quelques options plus difficiles à lire, à comprendre et éventuellement à déboguer :
Vous pouvez intégrer l'expression de la formule dans une instruction if, puis définir la formule.
Names Default To Here(1);
myvar = 1;
dt = Open("$SAMPLE_DATA/Big Class.jmp");
fexpr = If(Is Missing(myvar), Name Expr(:height/:weight), Name Expr(:weight/:height));
Eval(EvalExpr(
newcol = dt << New Column("Test", Numeric, Continuous, Formula(
Expr(NameExpr(fexpr))
))
));
Ou vous pouvez utiliser l'instruction if à l'intérieur de l'évaluation de votre formule (inutilement compliqué à mon avis).
Names Default To Here(1);
dt = Open("$SAMPLE_DATA/Big Class.jmp");
newcol = dt << New Column("Test", Numeric, Continuous);
Eval(Substitute(
Expr(newcol << Set Formula(
_fexpr_
)),
Expr(_fexpr_), If(Is Missing(myvar), Name Expr(:height/:weight), Name Expr(:weight/:height))
));
Re: Meilleure façon d'écrire une formule avec une référence de colonne potentiellement manquanteCe qui me dérange le plus avec la méthode actuelle, c'est son aspect surchargé. On trouve deux versions du même code, avec et sans la colonne intermittente. J'aurais pensé qu'un mécanisme similaire à une instruction Try() aurait permis de gérer cette incohérence. Cela simplifierait aussi le processus d'édition.
Re: Meilleure façon d'écrire une formule avec une référence de colonne potentiellement manquanteIl est difficile de gérer l'absence de référence à une colonne dans une formule (vous pourriez utiliser Try(), mais cela risque de ralentir considérablement la formule, ce que je déconseille). J'ai proposé des solutions pour éviter la duplication. Vous pourriez également créer une fonction pour créer la colonne et ajouter la formule.