Beste Methode zum Schreiben einer Formel mit einer möglicherweise fehlenden SpaltenreferenzIch habe ein Skript, das eine Formel basierend auf dem Inhalt eines Objekts erstellt. In manchen Fällen wird der Eintrag, der das Objekt befüllt, übersprungen. In diesem Fall ist N Items(yVars) == 0. Wie kann ich erreichen, dass die Formel auch ohne Spaltenbezug berechnet wird, wenn die Spalte leer ist?
Der unten stehende Fall ist übermäßig komplex, da ich auf das Vorhandensein eines Eintrags prüfe und eine If()-Anweisung verwende, um alternative Aktionen zu erstellen.
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 ) )
)
)
)
)
)
)
);
Automatisierung und SkripterstellungBetreff: Beste Methode zum Schreiben einer Formel mit möglicherweise fehlender SpaltenreferenzHier ist eine Möglichkeit:
//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] ) )
);
Betreff: Beste Methode zum Schreiben einer Formel mit möglicherweise fehlender SpaltenreferenzGibt es einen bestimmten Grund, warum Sie Ihre aktuelle Vorgehensweise vermeiden sollten? Wenn die Spaltenreferenz leer ist, fügen Sie sie nicht zur Formel hinzu.
Deine Vorgehensweise ist wirklich nicht kompliziert und leicht verständlich. Du könntest eine IF-Anweisung verwenden, um die Formel festzulegen, was die Wiederholungen etwas reduzieren würde. Ich würde entweder diese Methode oder deine jetzige verwenden (falls ich deine Frage richtig verstanden habe).
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
)
);
Einige schwieriger zu lesende, zu verstehende und möglicherweise zu debuggende Optionen:
Sie können den Formelausdruck in einer IF-Anweisung erstellen und dann die Formel festlegen.
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))
))
));
Alternativ können Sie die if-Anweisung innerhalb Ihrer Formelauswertung verwenden (meiner Meinung nach unnötig kompliziert).
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))
));
Betreff: Beste Methode zum Schreiben einer Formel mit möglicherweise fehlender SpaltenreferenzMein Hauptkritikpunkt an der aktuellen Methode ist ihre aufgeblähte Struktur. Es gibt zwei Versionen desselben Codes, eine mit und eine ohne die sporadisch auftretende Spalte. Ich hätte erwartet, dass es eine ähnliche Funktion wie eine `try()`-Anweisung gäbe, um diese Inkonsistenz zu beheben. So etwas würde auch die Bearbeitung erleichtern.
Betreff: Beste Methode zum Schreiben einer Formel mit möglicherweise fehlender SpaltenreferenzFehlende Spaltenbezüge lassen sich innerhalb der Formel nicht wirklich beheben (Sie könnten zwar `Try()` verwenden, aber das würde die Formel höchstwahrscheinlich sehr verlangsamen, weshalb ich davon abraten würde). Ich habe Ihnen einige Möglichkeiten aufgezeigt, wie Sie die Duplikation vermeiden können. Alternativ könnten Sie eine Funktion erstellen, die die Spalte erzeugt bzw. die Formel hinzufügt.