Hola,
He estado tratando de crear nuevas columnas dentro de un bucle con un par de variables en la fórmula. Las variables son nombres de columna que estoy tratando de restar. He leído hilos similares con personas que tienen un problema similar, pero ninguna de esas soluciones ha funcionado en mi caso. Un fragmento de mi bucle:
for (i=1, i<=n, i++,
S="Mean("||vars[i]||")";
S2="Wafer Mean("||vars[i]||")";
ddt << Update(
With(wt),
Match Columns(
:Lot = :Lot,
:Wafer = :Wafer,
:Recipe = :Recipe,
:LayoutSizeY = :LayoutSizeY,
Eval(cats) = Eval(cats)
),
Add Columns from Update table(
wt:S2;
)
);
ddt << New Column("Delta from wafer mean("||vars[i]||")", numeric, continuous, formula(ddt:S-ddt:S2));
ddt << Run formulas;
);
El problema es que JMP lo lee literalmente y pone S en la fórmula en lugar de la cadena. Probé varios comandos eval, evalexpr, expr, substitute pero ninguno ha producido los resultados requeridos.
¿Cualquier otra sugerencia?
Gracias
Hola @ jjswan33 ,
¡Bienvenido a la comunidad!
Las soluciones que buscó son todas soluciones adecuadas para lo que quiere hacer, pero tiene un par de problemas en su script:
1. No es necesario que la referencia de columna a la tabla "ddt" en la fórmula se deba a que el alcance implica que las columnas a las que se hace referencia en la fórmula están en la misma tabla que la columna en sí. Poner "ddt" allí va a codificarse en la fórmula de la columna, lo que significa que la fórmula no funcionará una vez que ddt ya no esté definido.
2. Debe incluir los nombres de las columnas en ": Nombre ()" porque tiene caracteres especiales en el nombre de la columna, específicamente los paréntesis. Por ejemplo, puede referirse a una columna "Var1" como: Var1, pero no puede referirse a una columna "Media (Var1)" como: Media (Var1); necesitaría usar: Nombre ("Mean (Var1)").
Ahora, soy parcial a Eval (Parse (Eval Insert ())) porque creo que es bastante fácil de entender. Comencemos con la parte más interna, Eval Insert, y luego trabajemos hacia afuera.
- Eval Insert (): use esto para evaluar variables dentro de una cadena. Dentro de la cadena, coloque los caracteres "^" alrededor de las variables que desee evaluar dentro de la cadena. Por ejemplo:
age = 30;
Eval Insert("She is ^age^ years old");
//Returns "She is 30 years old"Si necesita usar comillas dobles dentro de la cadena (en realidad lo hace en su caso), puede ser útil comenzar la cadena con "\ [" y terminar con "] \". Esto le permite usar comillas dobles libremente dentro de la cadena. Alternativamente, puede usar la sintaxis de escape para agregar comillas dobles (es decir, \! ") Dentro de la cadena. Aquí hay una cadena que debería funcionar para usted:
str = "\[ddt << New Column( "Delta from wafer mean(^vars[i]^)", numeric, continuous, formula( :Name("^S^") - :Name("^S2^") ) )]\"; - Parse (): convierte la cadena en una expresión.
- Eval (): evalúa la expresión que analizó de la cadena.
Para ponerlo todo junto, haga algo como esto:
str = "\[ddt << New Column( "Delta from wafer mean(^vars[i]^)", numeric, continuous, formula( :Name("^S^") - :Name("^S2^") ) )]\";
For( i = 1, i <= n, i++,
S = "Mean(" || vars[i] || ")";
S2 = "Wafer Mean(" || vars[i] || ")";
ddt << Update(
With( wt ),
Match Columns(
:Lot = :Lot,
:Wafer = :Wafer,
:Recipe = :Recipe,
:LayoutSizeY = :LayoutSizeY,
Eval( cats ) = Eval( cats )
),
Add Columns from Update table( wt:S2 )
);
Eval(Parse(Eval Insert( str )));
ddt << Run formulas;
);Tenga en cuenta que podría haber omitido la definición de una cadena fuera del bucle y podría haber pegado la cadena directamente en el Insert Ins en el bucle. Sin embargo, creo que esto hace que su código sea un poco más fácil de depurar. Si está recibiendo errores, con eso, mire Parse (Eval Insert (str)) y vea si la expresión se ve bien.
Esperemos que eso ayude!