Concatenare e sopprimere le formuleGente,
Ho diverse tabelle (campioni) che hanno molte formule di colonna attive. Il mio script a un certo punto concatena tutte le tabelle. Tuttavia, voglio che le formule vengano soppresse poiché voglio mantenere intatti i dati della singola tabella (campione) in modo da confrontare/sovrapporre tutti i dati concatenati. Sfortunatamente, non riesco a disattivare correttamente le formule quando vengono concatenate e le colonne appena concatenate vengono valutate, il che perde i singoli dati di esempio. Pensavo di avere questo battito con il codice allegato, ma quando ho ricopiato la tabella iniziale in un'altra cartella, le formule si sono "riattivate" causando un po' di frustrazione. Se c'è una buona soluzione, sono aperto a qualsiasi input poiché la valutazione della formula di soppressione non funziona nell'implementazione corrente.
Neil
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);
);
Tabella datiScriptingRe: 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;
Re: Concatenare e sopprimere le formuleJim,
Grazie per la risposta. Poiché ci sono circa 10 colonne con formule per tabella, esiste un approccio "coperta" per eliminare tutto in una volta?
Neil
Re: Concatena e sopprimi formulePuoi inserire i nomi delle colonne in un elenco, quindi scorrere l'elenco, eliminando ciascuno di essi.
Re: Concatena e sopprimi formuleJMP è anche in grado di farlo in modo interattivo con Standardize Attributes:
Seleziona tutte le colonne, fai clic con il pulsante destro del mouse su una delle colonne e seleziona Standardizza attributi:

Aggiungi la formula per eliminare le 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 si procede). Puoi anche ottenere tutte le colonne nella tabella con << Ottieni nomi colonna. 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 << Elimina 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)
);Re: Concatena e sopprimi 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 colonna particolare. 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:
"Diametro dei pori della colonna (um) non ha formula nell'accesso o nella valutazione di 'elimina formula', elimina formula/*###*/"
Ovviamente non ho ancora la comprensione della meccanica per vedere 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");Re: Concatena e sopprimi formuleSei sicuro di provare ad accedere al datatable corretto? Stai sempre aprendo lo stesso file di file_1 nel ciclo for.
Potresti aggiungere alcune stampe di debug all'interno del ciclo for per aiutarti a scoprire qual è il problema, come 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 datatable che non ti servono più con Close(dtref, no save);
Re: Concatena e sopprimi formuleJarmo,
Molte grazie per aver illuminato il problema. Non mi ero reso conto che ci sarebbe stato un problema senza una formula esistente. Tenendo presente questo fatto, ho creato un'istruzione condizionale per la prima tabella. Questo ovviamente ha funzionato poiché "file_1" ha cancellato una volta la formula della colonna specifica. Il codice allegato ha funzionato per l'esempio a colonna singola.
Ora che è chiaro che una formula deve essere presente, 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 corretto 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?
Neil
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");