Concatenare e sopprimere le formuleGente,
Ho diverse tabelle (campioni) che hanno molte formule di colonne attive. Il mio script a un certo punto concatena tutte le tabelle. Tuttavia, desidero sopprimere le formule poiché desidero mantenere intatti i singoli dati della tabella (campione) in modo da confrontare/sovrapporre tutti i dati che sono stati concatenati. Sfortunatamente, non riesco a disattivare correttamente le formule quando sono concatenate e le colonne appena concatenate vengono valutate, il che perde i singoli dati di esempio. Pensavo di avere questo ritmo con il codice allegato, ma quando ho ricopiato la tabella iniziale in un'altra cartella, le formule si sono "riattivate" causando una certa frustrazione. Se c'è una buona correzione, sono aperto a qualsiasi input poiché la valutazione della formula di soppressione non funziona nell'attuale implementazione.
Neill
Con = Expr(
n = N Table();
dt = {};
// Sort list ascending (sample replicates)
For( i = 1, i <= n, i++,
table = data table(i);
insert into(dt, table);
sort list into(dt)
);
// Concatenate each file (sample replicates)
dt_all = Data Table( dt[1] );
For(i = 1, i <= n, i++,
If(i > 1,
Suppress Formula Eval(suppress=1);
dt_all << Concatenate(Invisible, dt[i], Append to first table);
)
);
Current Data Table(dt_all);
);
Accesso ai datiQualità e ingegneria di processoRi: Concatenare e sopprimere le formuleJarno,
Ottimo contributo. In effetti stavo iniziando a guardare la via "Is Empty" ieri sera. Quindi, per finalizzare la discussione per eliminare le formule e concatenare, ho preso i tuoi suggerimenti e aggiornato il mio set di competenze codificando i tuoi suggerimenti. Inoltre, in base al mio post e codice originale, ho apportato anche aggiornamenti che hanno funzionato.
- Il primo blocco utilizza l'istruzione "Is Empty" per individuare NESSUNA colonna formula ed eliminare semplicemente le formule del resto.
- Il secondo blocco utilizza "Try" che all'inizio non ho compreso appieno quando l'hai suggerito anche dopo aver guardato l'indice di scripting. Pensavo che l'esecuzione si sarebbe interrotta come i tentativi precedenti, ma ovviamente no.
- Il terzo blocco utilizza "Elimina valutazione formula" per la prima tabella aperta. Tutte le altre tabelle vengono concatenate a questa prima tabella, che fornisce anche un output desiderato in cui le colonne finali della tabella concatenata non vengono valutate.
Non posso ringraziarti abbastanza per tutto il tuo contributo per aiutarmi a migliorare le mie capacità.
Neill
For( i=1, i <= N Items(b), i++,
If(i==1,
file_1 = Open(SD1 || b[1]);
CN = file_1 << get column names(numeric);
For(j=1, j <= N Items(CN), j++,
result = Column(file_1, CN[j]) << Get Formula;
y = Is Empty(result);
If(y==0, Column(file_1, CN[j]) << delete formula);
);
);
If(i > 1,
file_nxt = Open(SD1 || b[i], Private);
file_1 << Concatenate(file_nxt, append to first table);
Close(file_nxt, no save);
);
);
file_1 << Save(SD1 || "All Summary");
Close("All Summary");For( i=1, i <= N Items(b), i++,
If(i==1,
file_1 = Open(SD1 || b[1]);
CN = file_1 << get column names(numeric);
For(j=1, j <= N Items(CN), j++,
Try(Column(file_1, CN[j]) << delete formula);
);
);
If(i > 1,
file_nxt = Open(SD1 || b[i], Private);
file_1 << Concatenate(file_nxt, append to first table);
Close(file_nxt, no save);
);
);
file_1 << Save(SD1 || "All Summary");
Close("All Summary");For( i=1, i <= N Items(b), i++,
If(i==1,
file_1 = Open(SD1 || b[1]);
file_1 << Suppress Formula Eval(1);
);
If(i > 1,
file_nxt = Open(SD1 || b[i], Private);
file_1 << Concatenate(file_nxt, append to first table);
Close(file_nxt, no save);
);
);
file_1 << Save(SD1 || "All Summary");
Close("All Summary");Ri: Concatenare e sopprimere le formuleSe non hai necessariamente bisogno delle formule, non è nemmeno necessario crearle poiché puoi usare << Imposta ogni valore invece di formula (o rimuovi le formule immediatamente dopo la creazione). Ma se ne hai bisogno, puoi controllare se la colonna ha una formula con << prendi la formula e se il risultato è Vuoto () allora la formula non esiste (usa IsEmpty () per verificare la formula mancante) o potresti "forza bruta " con Try-catch.
Ottieni la formula:
Names Default To Here(1);
dt = Open("$SAMPLE_DATA/Big Class.jmp");
col = New Column("Ratio");
result = col << Get Formula;
Show(result, IsEmpty(result));
col << Set Formula(:Height / :Weight);
col << Eval Formula;
result = col << Get Formula;
Show(result, IsEmpty(result));
Prova a prendere:
Names Default To Here(1);
dt = Open("$SAMPLE_DATA/Big Class.jmp");
col = New Column("Ratio");
Try(col << Delete formula, show(exception_msg)); //the show part isn't necessary
Quindi, se si desidera eseguire il ciclo appena sopra le colonne che hanno formule, è possibile eseguire il ciclo sull'elenco e crearne uno nuovo (se si dispone di JMP16 utilizzare Filter Each).
Ci sono anche alcuni post nella community su come rimuovere tutte le formule nella tabella, eccone uno ad esempio: Trova ed elimina tutte le formule presenti in una tabella
Ri: Concatenare e sopprimere le formuleJarmo,
Molte grazie per aver illuminato la questione. Non mi ero reso conto che ci sarebbe stato un problema senza una formula esistente. Con questo fatto in mente, ho creato un'istruzione condizionale per la prima tabella. Questo ovviamente ha funzionato poiché "file_1" ha la formula di colonna specifica eliminata una volta. Il codice allegato ha funzionato per l'esempio a colonna singola.
Ora che è chiaro che deve essere presente una formula, il problema è che tutte le colonne non hanno formule. Quindi, se recupero tutti i nomi delle colonne, ci sarà un sottoinsieme che non ha colonne associate. C'è un modo per verificare se una colonna ha una formula in modo da poter costruire un elenco appropriato per il ciclo? O semplicemente "forza bruta" il problema impostando un elenco in JSL che dovrò aggiornare ogni volta che aggiungo una formula a una colonna?
Neill
For( i=1, i <= N Items(b), i++,
If(i==1,
file_1 = Open(SD1 || b[1]);
file_1:"Pore Diameter (um)" << delete formula;
);
If(i > 1,
file_nxt = Open(SD1 || b[i], Private);
file_1 << Concatenate(file_nxt, append to first table);
Close(file_nxt, no save);
);
);
file_1 << Save(SD1 || "All Summary");
Close("All Summary");
Ri: Concatenare e sopprimere le formuleSei sicuro di provare ad accedere al datatable corretto? Stai sempre aprendo lo stesso file come file_1 nel ciclo for.
Potresti aggiungere alcune stampe di debug all'interno del ciclo for per aiutarti a scoprire qual è il problema, ad esempio:
file_1 = Open(SD1 || b[1]);
show(file_1);
show(file_1 << Get Column Names("String")); //depending how many columns you have might not want to do this
show(Contains(file_1 << Get Column Names("String"), "Pore Diameter (um)"));
file_1:"Pore Diameter (um)" << delete formula;Ricorda anche di chiudere i datatables che non ti servono più con Close(dtref, no save);
Ri: Concatenare e sopprimere le formuleScusa per il ritardo della risposta. Apprezzo tutti i feedback.
Senza attaccare ancora tutte le colonne, ho appena provato a eliminare una formula in una particolare colonna. Quando applico la riga "elimina formula" al di fuori del ciclo, ottengo il risultato desiderato, ovvero non esiste alcuna formula. Tuttavia, se la stessa riga va all'interno del ciclo, dopo che il file è stato aperto, ottengo il seguente errore:
"Il diametro dei pori della colonna (um) non ha formule in accesso o valutazione di 'elimina formula', elimina formula/*###*/"
Ovviamente non ho ancora la comprensione dei meccanici per capire perché c'è un problema. Saresti in grado di fornire qualche spunto?
Grazie molto.
For( i=1, i <= N Items(b), i++,
file_1 = Open(SD1 || b[1]);
file_1:"Pore Diameter (um)" << delete formula;
If(i > 1,
file_nxt = Open(SD1 || b[i], Private);
file_1 << Concatenate(file_nxt, Append to first table);
);
);
//file_1:"Pore Diameter (um)" << delete formula;
file_1 << Save(SD1 || "All Summary");
Close("All Summary");Ri: Concatenare e sopprimere le formuleJMP è anche in grado di farlo in modo interattivo con Standardizza attributi:
Seleziona tutte le colonne, fai clic con il tasto destro su una delle colonne e seleziona Standardizza attributi:

Aggiungi formula a Elimina proprietà e premi OK (o applica):

Se hai JMP16, questo verrà stampato su Enhanced Log:
// Open Data Table: Wheat.jmp
// → Data Table("Wheat")
Open("$SAMPLE_DATA/Wheat.jmp");
// Standardize column attributes
Local({old dt = Current Data Table()},
Current Data Table(Data Table("Wheat"));
For Each({col, index},
{:Variety, :Yield, :Moisture, :Pred Formula Yield, :Cond Pred Formula Yield},
col << Delete Formula
);
Current Data Table(old dt);
);
E questo darà una buona idea di come gestirlo (come ha detto txnelson, scorrere l'elenco ed eliminare le formule mentre procedi). Puoi anche ottenere tutte le colonne nella tabella con << Ottieni nomi di colonne. Non sarai in grado di rimuovere le formule dalle colonne che non le hanno (e lo script fornito dal registro avanzato non funzionerà direttamente in questo modo), ma puoi aggirarlo avvolgendo la formula col << Delete con Try(). Dopo aver ripulito lo script di registro avanzato potresti ritrovarti con qualcosa del genere:
Names Default To Here(1);
dt = Open("$SAMPLE_DATA/Wheat.jmp");
For Each({col}, dt << get column names(String),
Try(Column(dt, col) << Delete Formula)
);Ri: Concatenare e sopprimere le formulePuoi inserire i nomi delle colonne in un elenco e quindi scorrere l'elenco, eliminando ciascuno di essi.
Ri: Concatenare e sopprimere le formuleJim,
Grazie per la risposta. Poiché ci sono circa 10 colonne con formule per tabella, esiste un approccio "generale" per eliminare tutto in una volta?
Neill
Ri: Concatenare e sopprimere le formuleQuello che devi fare è eliminare le formule prima della concatenazione.Ciò convertirà i valori in valori statici e quindi non avrai problemi.
:yourColumn << delete formula;