Ciao,
Ho cercato di creare nuove colonne all'interno di un ciclo con un paio di variabili nella formula. Le variabili sono nomi di colonne che sto cercando di sottrarre. Ho letto thread simili con persone che hanno un problema simile ma nessuna di queste soluzioni ha funzionato nel mio caso. Un frammento del mio ciclo:
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;
);
Il problema è che JMP sta leggendo letteralmente e mettendo S nella formula piuttosto che nella stringa. Ho provato vari comandi di valutazione, evalexpr, expr, ma nessuno ha prodotto i risultati richiesti.
Qualche altro suggerimento?
Grazie
Ciao @ jjswan33 ,
Benvenuto nella community!
Le soluzioni che hai esaminato sono tutte soluzioni appropriate per quello che vuoi fare, ma hai un paio di problemi nel tuo script:
1. Non è necessario circoscrivere il riferimento della colonna alla tabella "ddt" nella formula poiché l'ambito è implicito che le colonne a cui si fa riferimento nella formula si trovano nella stessa tabella della colonna stessa. Mettendo "ddt" dentro ci sarà l'hardcode nella formula della colonna, il che significa che la formula non funzionerà quando il ddt non sarà più definito.
2. È necessario racchiudere i nomi delle colonne in ": Name ()" perché nel nome della colonna sono presenti caratteri speciali, in particolare le parentesi. Ad esempio, è possibile fare riferimento a una colonna "Var1" come: Var1, ma non è possibile fare riferimento a una colonna "Media (Var1)" come: Media (Var1); dovresti usare: Nome ("Media (Var1)").
Ora, sono parziale a Eval (Parse (Eval Insert ())) perché penso che sia abbastanza facile da capire. Iniziamo con la parte più interna, Eval Insert, e poi procediamo verso l'esterno.
- Eval Insert () - usa questo per valutare le variabili all'interno di una stringa. All'interno della stringa, inserisci i caratteri "^" attorno alle variabili che vuoi valutare all'interno della stringa. Per esempio:
age = 30;
Eval Insert("She is ^age^ years old");
//Returns "She is 30 years old"Se hai bisogno di usare virgolette doppie all'interno della stringa (lo fai effettivamente nel tuo caso), allora può essere utile iniziare la stringa con "\ [" e terminare con "] \". Questo ti permette di usare doppie virgolette liberamente all'interno della stringa. In alternativa, è possibile utilizzare la sintassi di escape per aggiungere virgolette doppie (ad es. \! ") All'interno della stringa. Ecco una stringa che dovrebbe funzionare per te:
str = "\[ddt << New Column( "Delta from wafer mean(^vars[i]^)", numeric, continuous, formula( :Name("^S^") - :Name("^S2^") ) )]\"; - Parse () - converte la stringa in un'espressione.
- Eval () - valuta l'espressione che hai analizzato dalla stringa.
Per mettere tutto insieme, fai qualcosa di simile a questo:
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;
);Nota, avrei potuto saltare la stringa di definizione al di fuori del ciclo e avrei potuto semplicemente mettere la stringa direttamente in Eval Insert all'interno del ciclo. Tuttavia, penso che ciò renda il tuo codice un po 'più facile da eseguire il debug. Se ricevi degli errori, guarda Parse (Eval Insert (str)) e verifica se l'espressione sembra corretta.
Speriamo che questo aiuti!