Ho menzionato alcuni possibili argomenti in una delle mie e-mail, ma ecco alcune idee:
- Utilizzando i riferimenti
- dt = Open()... e così via invece di Current Data Table()
- Trovare riferimenti a report/nel livello report in modo affidabile
- Gestione dello spazio dei nomi/ambiti
- Inizializzazione delle variabili
- Trovare lo stile di programmazione
- scrivere i valori globali in MAIUSCOLO
- Utilizzando le espressioni
- Prova a prendere
- Registrazione
- Mostra, scrivi, stampa, logger personalizzato
- Utilizzando Stack
- Variabili nei pulsanti/finestre
- Soprattutto quando si torna dalla funzione
- Casella di contesto(), finestra:
- Pulsante - Percorsi
- Script di confezionamento
- Invece di creare script JMP di grandi dimensioni, separare le parti da quelle in script più robusti
- Migliori pratiche
- Evitare Cancella/Elimina simboli/Globali
- Non lasciare script Cancella accesso
- Bloccare variabili/spazi dei nomi
- Percorsi
- Converti percorso file
- Directory predefinita
- $VARIABILI_PERCORSO
- Colonne di riferimento
- Column(dt, "colname") vs dt:colname vs :colname, vs dt:"colname"n (e AsColumn) e così via...
- Matematica in virgola mobile
- Guarda prima di saltare vs È più facile chiedere perdono che permesso quando scrivi codice
- Valori mancanti/vuoti
- È vuoto(), È mancante(), Se, IfMZ, N elementi() > 0
- Controllo di tabelle aperte, report aperti, finestre personalizzate già aperte,...
- <
- Throw() in .jsl vs jmpaddin
- Funzione finestra modale personalizzata
- Miglioramento (e utilizzo) degli script creati da JMP
- Aggiunta di riferimenti/variabili
- Accorciamento degli script creati da JMP
- Evitare la spedizione
- Come le preferenze dell'utente possono influenzarli (di solito causando problemi molto grossi)
- Comprendere e utilizzare le strutture dati
- Ad esempio, non è necessario memorizzare tutto in nomi di variabili diversi (soprattutto non quando si utilizza Eval Parse)
- Utilizza elenchi/array associativi
- Se si parla di interfaccia utente, potrebbero essere presenti riferimenti quando necessari
Post parzialmente correlati (potrebbero apparire estremamente disordinati a causa delle "nuove" pagine della community JMP)
GRAZIE, qui posso condividere alcune delle mie cose, ma la maggior parte di ciò che faccio è già menzionato sopra:
- Prova(chiudi(dt_ref,nosave)); dt_ref = Open(...) --> ripulisce una tabella e non produce un errore quando lo script viene eseguito per la prima volta. Il problema è che puoi rinominare la tabella ma JSL la chiuderà comunque poiché cambia anche il riferimento dt.
- Utilizza sempre la scheda per identificare cicli e funzioni più grandi in modo da non perderti nel codice e cercare un );
- Considera la possibilità di rinominare le colonne dopo un passaggio di tabulazione se vedi la possibilità di utilizzo multilingue. Questo può rompere il codice di un altro utente ma il tuo funziona bene.
- Try to dynamically work with reference in platform to avoid user inputs.
You could do this:
dt << Process screening(Process Variables({:Column 4, :Column 6, :Column 7}));
But you can also use this:
dt = current data table();
col_names = dt << get column names();
spec_list = {};
for(k=1,k<=nitems(col_names),k++,
if(!isempty(column(dt,k) << Get Property("Speclimits")),insertinto(spec_list,col_names[k]);););
dt << Process screening(Process Variables(eval(spec_list)));
altering a column name will then not break the code and the question about missing spec limits will not be triggered. -
Molto probabilmente opterò per qualcosa come attachment (sicuramente non avrò abbastanza tempo per esaminarli tutti, ma non dovrebbe essere un problema). Potrei essere finito con qualcosa come "suggerimenti per JSL", ma ci è voluto abbastanza tempo anche solo per crearlo.
Grazie Jarmo, qualche riflessione sulla sceneggiatura:
riga 103: la uso solo quando il ciclo è molto breve e c'è solo una riga da eseguire. In questo modo il codice rimane un po' più ordinato.
riga 109: con nomi brevi potresti riscontrare problemi nell'override di una funzione JMP con una variabile come mean = (x1 + x2 ) / 2; è meglio scrivere m_production_speed o mean_production_speed.
riga 149: Ho preso l'abitudine di commentare un ciclo if subito dopo la virgola per il ripiegamento del codice:
Se scrivi il codice in questo modo:
if(1,//average of x
mean_x = mean(x);
);
e ripieghi il codice, apparirà così:

Mi fa risparmiare una riga prima del ciclo for o dell'istruzione if.
riga 198: " Inizializziamo la matrice, perché se la creiamo in anticipo, il suo riempimento sarà più rapido". Ci ho messo 1 minuto con Copilot, non riesco a immaginare di eseguire il debug di un codice con 200 commenti *g*.
riga 212: Vorrei menzionare che puoi usare log e workflow come riferimento e poi modificare il codice in base al tuo stile di programmazione. Questo è particolarmente il caso quando chiedo a un utente non programmatore di creare un workflow di ciò che desidera ottenere con lo script che dovrei programmare per lui. Quindi ho una buona comprensione di ciò che desidera e ho già codificato la maggior parte della funzione.
riga 391: Questo può velocizzare lo script quando si scorre una tabella mentre si ha un generatore di grafici aperto, in modo che non aggiorni il grafico a ogni modifica.
Names Default To Here( 1 );
try(close(dt,nosave));
dt = new table("test");
dt << New Column( "Y",
Numeric,
"Continuous",
Format( "Best", 12 ),
<<SET initial="" data="https://community.jmp.com/"></SET><SPAN>riga 414: Oltre a questo aggiungerei: aggiungere sempre un riferimento alla tabella quando si fornisce un nome fisso quando si usano funzioni come << Subset e così via) questo è molto utile quando il nome di generazione esiste già e JMP aggiunge automaticamente il " 2" alla fine. Senza un riferimento si potrebbe lavorare accidentalmente sulla tabella sbagliata.</SPAN>
<SPAN>riga 74: questa è una cosa che ruberò per i miei script</SPAN>:)</img>
<SPAN>line757: a volte può anche rallentare i cicli for fino a farli andare a rotoli, ma è utile quando si hanno istruzioni SQL, poiché l'invio di una richiesta può sovraccaricare il resto dello script e causare un errore, perché potrebbe volerci del tempo per ottenere i dati, ma funziona bene quando si esegue il codice riga per riga.</SPAN>
line 780: maybe referencing to the JSL cook book? <A href="https://community.jmp.com/t5/JSL-Cookbook/tkb-p/jmp-scripting" target="_blank">JSL Cookbook - Comunità di utenti JMP</A>
line 787: Just be aware that this will also break when a report reference name contains a variable.
This is what happened here: <A href="https://community.jmp.com/t5/Discussions/fitting-truncated-data-to-a-continuous-distribution/m-p/772495#M95287" target="_blank">Re: adattamento di dati troncati a una distribuzione continua - JMP User Community</A>
the detection limits is added with censored data in the title and can change depending on the data set.
THX a lot for the script.<BR /><BR />Regards<BR /> Mauro
riga 787
Questo è esattamente il motivo per cui uso quasi sempre XPath con l'attributo helpKey se è disponibile (non mi interessa il titolo dell'outlinebox). Ci sono troppi modi di (provare a) costruire riferimenti robusti, che potrei passare ~20 minuti con esempi su questo.
Ad esempio, con i limiti di rilevamento userei helpKey OPPURE i caratteri jolly (se sapessi che il nome della casella di riepilogo può cambiare...)
Names Default To Here(1);
dt = open("$SAMPLE_DATA/Big Class.jmp");
Column(dt, "height") << Set Property("Detection Limits", {60, 100});
dist = dt << Distribution(
Stack(1),
Continuous Distribution(
Column(:height),
Horizontal Layout(1),
Vertical(0),
Process Capability(0),
Fit Normal
)
);
obs = Report(dist) << XPath("//OutlineBox[@helpKey='FitDistributions']");
show(obs << get title);
// Or
ob = Report(dist)[OutlineBox("Fitted Normal Distribution?")];
show(ob << get title);
// Or
obs2 = Report(dist) << XPath("//OutlineBox[contains(text(), 'Fitted Normal Distribution')]");
show(ob << get title);
</CODE></P>
<P>I also added few things based on your comments. Thanks!<CODE class=" language-jsl">