Re : instructions If imbriquéesJe suggérerais d'utiliser Contient () au lieu d'une longue liste de copies collées ou d'instructions et d'un éventuel tableau associatif pour la comparaison de valeurs. Si vous avez besoin d'une formule, vous devrez peut-être utiliser Insérer une expression dans une autre en utilisant Eval Insert, Eval Expr, Parse et Substitute pour obtenir des listes / tableaux associatifs dans la formule. Cela peut donner des idées :
Names Default To Here(1);
aa_pc_limits = Associative Array();
aa_pc_limits["MIX 1 A"] = {1, 5};
aa_pc_limits["MIX 2 B"] = {3, 4};
aa_pc_limits["MIX 2 C"] = {2, 5};
aa_pc_limits["MIX 2 D"] = {1, 4};
ntc_valid = {"MTX 1 A", "MIX 2 B", "MIX 2C"};
non_pc_valid = {"MTX 1 IC", "MIX 2 IC", "MIX 3 IC"};
dt = New Table("Untitled",
Add Rows(8),
New Column("Sample Name",
Character,
"Nominal",
Set Values({"NTC", "NTC", "AA", "AA", "AA", "PC", "PC", ""})
),
New Column("Target Name",
Character,
"Nominal",
Set Values(
{"MTX 1 A", "MTX AAAA", "MTX 1 IC", "MTX 1 IC", "AAA", "MIX 1 A", "BBB",
""}
)
),
New Column("CT_numeric",
Numeric,
"Continuous",
Format("Best", 12),
Set Values([., ., 2, 5, ., 2, 5, .])
),
New Column("CT",
Character,
"Nominal",
Set Values({"Undetermined", "", "", "", "", "", "", ""})
),
New Column("Run Validity",
Character,
"Nominal",
Set Values({"", "", "", "", "", "", "", ""})
)
);
dt:Run Validity << Set Formula(
If(:Sample Name == "NTC",
If(Contains(ntc_valid, :Target Name),
If(:CT == "Undetermined",
"Pass";
, // else
"Fail";
)
, // else
"NOT DEFINED. NTC"
)
, :Sample Name != "PC",
If(Contains(non_pc_valid, :Target Name),
If((1 < :CT_numeric < 4),
"Pass"
,
"Fail"
)
,
"NOT DEFINED. NON-PC"
)
, :Sample Name == "PC",
If(Contains(aa_pc_limits, :Target Name),
IfMZ(aa_pc_limits[:Target Name][1] < :CT_numeric < aa_pc_limits[:Target Name][2],
"PASS"
,
"FAIL"
)
,
"NOT DEFINED. PC";
)
, //else
"NOT DEFINED";
);
);Re : instructions If imbriquéesMerci pour cela, mais je ne suis pas sûr d'avoir tout suivi. A quoi font référence 12, 13, 14 etc. dans ce cas ?
Merci
Re : instructions If imbriquéesMerci, je cherchais quelque chose comme contient depuis des lustres mais je ne l'ai pas trouvé. Et merci pour le nid si les déclarations, je vais essayer.
Re : instructions If imbriquéesJe suppose qu'ils se réfèrent aux âges (et aux clés dans les tableaux associatifs pour effectuer une recherche).
Re : instructions If imbriquées12,13,14 sont les âges des rangs des grandes classes.
Les [ crochets ] du tableau associatif externe définissent deux entrées, une pour "M" et une pour "F". Chacune de ces entrées est également un tableau associatif avec plusieurs entrées indexées par âge. En bas, vous pouvez voir un index bidimensionnel utilisant [sex][age] pour rechercher une règle. Les tableaux associatifs ont également une valeur autrement qui peut être utilisée lorsque la clé n'est pas dans le tableau.
Ainsi, Lookup["M"] renvoie un AA avec des entrées pour 12 et 13 ; Lookup["M"][12] renvoie la règle 80...90 et l'évaluation utilise la valeur de poids de la ligne actuelle pour produire une chaîne.
Le =>"?" doit être =>[=>"?"] pour fonctionner réellement s'il y avait des valeurs autres que F et M. Sinon Lookup["X"] ne renverrait pas l'AA attendu pour un 2ème index.
Re : instructions If imbriquéesUne autre approche possible pour gérer un ensemble complexe de règles
dt = open("$sample_data/big class.jmp");
dt<<NEWCOLUMN> [ // rules for females, by age
12 => if(59<HEIGHT><63,"Pass","Fail"),
13 => if(60<HEIGHT><65,"Pass","Fail"),
14 => "Fail",
15 => "Pass",
=> "Maybe" // rule for other ages
],
"M" => [ // rules for males, by age
12 => if(80<WEIGHT><90,"Pass","Fail"),
13 => if(name=="JOHN","Pass","Fail"),
=> "Possibly" // rule for other ages
],
=> [ => "?"] // rule for unknown sex
]);
// use the table, above, to look up a rule, then evaluate the rule
Eval( lookup[:sex][:age] )
));</WEIGHT></HEIGHT></HEIGHT></NEWCOLUMN>
Edit : modifié =>"?" à =>[=>"?"] comme décrit ci-dessous.
Instructions If imbriquéesBonjour, je me perds dans l'implémentation des instructions If imbriquées dans JSL :
dt1:Run Validity <<
Set Formula(
If( (:Sample Name == "NTC" & (:Target Name == "MIX 1 A" | :Target Name == "MIX 2 B" | :Target Name == "MIX 2 C" | :Target Name == "MIX 2 D" | :Target Name == "MIX 3 F" |
:Target Name == "MIX 3 G" | :Target Name == "MIX 3 H" | :Target Name == "MIX 4 I" | :Target Name == "MIX 4 J")), If( (:CT == "Undetermined"), "Pass", "Fail")),
If( (:Sample Name == "PC" & :Target Name == "MIX 1 A"), If( (1 < :CT_numeric < 5), "Pass", "Fail")),
If( (:Sample Name == "PC" & :Target Name == "MIX 2 B"), If( (3 < :CT_numeric < 4), "Pass", "Fail")),
If( (:Sample Name == "PC" & :Target Name == "MIX 2 C"), If( (2 < :CT_numeric < 5), "Pass", "Fail")),
If( (:Sample Name == "PC" & :Target Name == "MIX 2 D"), If( (1 < :CT_numeric < 4), "Pass", "Fail")),
If( (:Sample Name == "PC" & :Target Name == "MIX 3 E"), If( (1 < :CT_numeric < 3), "Pass", "Fail")),
If( (:Sample Name == "PC" & :Target Name == "MIX 3 F"), If( (4 < :CT_numeric < 5), "Pass", "Fail")),
If( (:Sample Name == "PC" & :Target Name == "MIX 3 G"), If( (3 < :CT_numeric < 6), "Pass", "Fail")),
If( (:Sample Name == "PC" & :Target Name == "MIX 4 H"), If( (1 < :CT_numeric < 4), "Pass", "Fail")),
If( (:Sample Name == "PC" & :Target Name == "MIX 4 I"), If( (2 < :CT_numeric < 5), "Pass", "Fail")),
If( (:Sample Name != "PC" & (:Target Name == "MIX 1 IC" |:Target Name == "MIX 2 IC" | :Target Name == "MIX 3 IC" | :Target Name == "MIX 4 IC")), If((1 < :CT_numeric < 4), "Pass", "Fail"))
);
Essentiellement, je veux pour les lignes avec le nom de l'échantillon = NTC et le nom cible l'un des Mix 1 A, Mix 1 B... si CT est indéterminé, le retour passe, sinon échoue
Existe-t-il une meilleure façon de le faire avec les instructions if? Ou pourriez-vous indiquer où je me trompe?
Merci
Modélisation statistique avancéeAutomatisation et scriptÉtudes de consommation et de marché