Il modo migliore per scrivere una formula con un riferimento di colonna potenzialmente mancanteHo uno script che crea una formula basata sul contenuto di un oggetto. In alcuni casi, il campo che popola l'oggetto viene ignorato. In tal caso, N Items(yVars) == 0. Come posso fare in modo che la formula venga calcolata senza il riferimento alla colonna se questa è vuota?
Il caso seguente è eccessivamente complesso: verifico la presenza di una voce e utilizzo un'istruzione If() per creare azioni alternative.
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 ) )
)
)
)
)
)
)
);
Automazione e scriptingOggetto: Il modo migliore per scrivere una formula con un riferimento di colonna potenzialmente mancanteEcco un modo:
//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] ) )
);
Oggetto: Il modo migliore per scrivere una formula con un riferimento di colonna potenzialmente mancanteEsiste un motivo specifico per evitare di fare ciò che stai facendo attualmente? Se il riferimento alla colonna è vuoto, non aggiungerlo alla formula.
Il tuo metodo non presenta particolari complessità ed è facile da leggere e comprendere. Potresti utilizzare un'istruzione if per impostare la formula, riducendo così leggermente le ripetizioni. Io opterei per questa soluzione o per il metodo che stai utilizzando (se ho ben capito la tua domanda).
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
)
);
Alcune opzioni più difficili da leggere, comprendere e potenzialmente sottoporre a debug:
È possibile costruire l'espressione della formula nell'istruzione if e quindi impostare la formula
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))
))
));
Oppure puoi usare l'istruzione if all'interno della valutazione della tua formula (inutilmente complicata a mio parere).
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))
));
Oggetto: Il modo migliore per scrivere una formula con un riferimento di colonna potenzialmente mancanteCredo che la mia obiezione principale al metodo attuale sia che sembra eccessivamente complesso. Ci sono due versioni dello stesso codice, una con la colonna "intermittente" e una senza. Avrei pensato che ci sarebbe stato qualcosa di analogo a un'istruzione Try() per gestire l'incoerenza. Una soluzione del genere renderebbe anche più semplice il processo di modifica.
Oggetto: Il modo migliore per scrivere una formula con un riferimento di colonna potenzialmente mancanteNon è possibile gestire i riferimenti di colonna mancanti all'interno della formula (si potrebbe usare Try(), ma molto probabilmente rallenterebbe notevolmente l'esecuzione della formula e non lo consiglierei). Ho comunque fornito alcune opzioni per evitare la duplicazione. In alternativa, si potrebbe creare una funzione per creare la colonna/aggiungere la formula.