Betreff: Verschachtelte If-AnweisungenIch würde vorschlagen, Contains () anstelle einer langen, kopierten Liste von oder -Anweisungen und eines möglichen assoziativen Arrays für den Wertevergleich zu verwenden. Wenn Sie eine Formel benötigen, müssen Sie möglicherweise verwenden Fügen Sie mit Eval Insert, Eval Expr, Parse und Substitute einen Ausdruck in einen anderen ein um Listen / assoziative Arrays in die Formel zu bekommen. Das könnte einige Ideen geben:
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";
);
);Betreff: Verschachtelte If-AnweisungenVielen Dank dafür, aber ich bin mir nicht sicher, ob ich ihm vollständig folge. Worauf beziehen sich in diesem Fall 12, 13, 14 usw.?
Vielen Dank
Betreff: Verschachtelte If-AnweisungenDanke, ich habe ewig nach so etwas gesucht, konnte es aber nicht finden. Und danke für die Nest-If-Anweisungen, ich werde es versuchen.
Betreff: Verschachtelte If-AnweisungenIch würde vermuten, dass sie sich auf Alter beziehen (und Schlüssel in assoziativen Arrays, um eine Suche durchzuführen).
Betreff: Verschachtelte If-Anweisungen12,13,14 sind die Alter der großen Klassenreihen.
Die [eckigen Klammern] für das äußere assoziative Array definieren zwei Einträge, einen für "M" und einen für "F". Jeder dieser Einträge ist auch ein assoziatives Array mit mehreren Einträgen, die nach Alter indiziert sind. Unten sehen Sie einen zweidimensionalen Index mit [Geschlecht][Alter], um eine Regel nachzuschlagen. Assoziative Arrays haben auch einen anderen Wert, der verwendet werden kann, wenn der Schlüssel nicht im Array enthalten ist.
Lookup["M"] gibt also ein AA mit Einträgen für 12 und 13 zurück; Lookup["M"][12] gibt die 80...90-Regel zurück und deren Auswertung verwendet den Gewichtswert aus der aktuellen Zeile, um eine Zeichenfolge zu erzeugen.
Das =>"?" muss =>[=>"?"] sein, um tatsächlich zu funktionieren, wenn es andere Werte als F und M gäbe. Andernfalls würde Lookup["X"] nicht das erwartete AA für einen zweiten Index zurückgeben.
Betreff: Verschachtelte If-AnweisungenEin weiterer möglicher Ansatz zur Verwaltung eines komplizierten Regelwerks
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: geändert => "?" zu =>[=>"?"] wie unten beschrieben.
Verschachtelte If-AnweisungenHallo, ich verliere mich bei der Implementierung verschachtelter If-Anweisungen in 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"))
);
Im Wesentlichen möchte ich für Zeilen mit Probenname = NTC und Zielname eine von Mix 1 A, Mix 1 B ... wenn CT unbestimmt ist, „Pass“ zurückgeben, andernfalls „Fail“.
Gibt es eine bessere Möglichkeit, dies mit if-Anweisungen zu tun? Oder könnten Sie mir sagen, wo ich falsch liege?
Danke
Erweiterte statistische ModellierungAutomatisierung und SkripterstellungVerbraucher- und Marktforschung