La mejor manera de escribir una fórmula con una referencia de columna potencialmente faltanteTengo un script que crea una fórmula basada en el contenido de un objeto. En algunos casos, se omite la entrada que rellena el objeto. En ese caso, N Items(yVars) == 0. ¿Cómo puedo hacer que la fórmula calcule sin la referencia a la columna si está vacía?
El caso que se muestra a continuación es excesivamente complejo, ya que verifico la presencia de una entrada y utilizo una instrucción If() para crear acciones alternativas.
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 ) )
)
)
)
)
)
)
);
Automatización y secuencias de comandosRe: La mejor manera de escribir una fórmula con una referencia de columna potencialmente faltanteAquí hay una manera:
//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: La mejor manera de escribir una fórmula con una referencia de columna potencialmente faltante¿Existe alguna razón específica para evitar hacer lo que estás haciendo actualmente? Si la referencia de columna está vacía, no la añadas a la fórmula.
Tu método no tiene nada de complejo y es fácil de leer y comprender. Podrías usar una sentencia condicional para simplemente establecer la fórmula, lo que reduciría ligeramente la repetición. Yo usaría esta opción o la que estás utilizando (si entendí bien tu pregunta).
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
)
);
Algunas opciones más difíciles de leer, comprender y posiblemente depurar:
Puedes construir la expresión de la fórmula en una instrucción if y luego establecer la fórmula.
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))
))
));
O bien, puedes usar la instrucción if dentro de la evaluación de tu fórmula (innecesariamente complicado en mi opinión).
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: La mejor manera de escribir una fórmula con una referencia de columna potencialmente faltanteCreo que mi principal objeción al método actual es que resulta excesivo. Hay dos versiones del mismo código, una con la columna intermedia y otra sin ella. Habría pensado que habría algo similar a una instrucción Try() para solucionar la inconsistencia. Algo así también facilitaría el proceso de edición.
Re: La mejor manera de escribir una fórmula con una referencia de columna potencialmente faltanteNo es posible gestionar la falta de referencias a columnas dentro de la fórmula (se podría usar Try(), pero probablemente ralentizaría mucho la fórmula y no lo recomiendo). He incluido algunas opciones para evitar la duplicación. También se podría crear una función para crear la columna o añadir la fórmula.