L'uso più comune del linguaggio di scripting JMP è l'automazione del lavoro. Forse il secondo uso più comune è l'estrazione di risultati dalle finestre JMP. È facile da fare, ma sfortunatamente, non è chiaro ai non addetti ai lavori come farlo con uno script. Spieghiamo la costruzione di finestre con un modello unificato di oggetti di visualizzazione. Mostreremo poi come indirizzare qualsiasi contenuto in qualsiasi finestra. Infine, mostreremo diverse forme alternative di indirizzamento.
Presentiamo in particolare il linguaggio di query XPath. Le rigorose informazioni di base sono integrate da esempi pratici ed esemplificativi che abbiamo sviluppato durante la scrittura di script di test unitari per lo sviluppo JMP. Evidenzieremo inoltre gli strumenti JMP interattivi che rendono l'utilizzo dei contenuti JMP più semplice e accessibile, oltre ad alcune best practice. Lasciate che vi mostriamo il modo migliore per ottenere ciò che desiderate dai vostri risultati JMP!
Salve. Sono Mark Bailey e sono qui con la mia collega Tanya Muldon. Il titolo della nostra presentazione è: "Lo vedo, come lo ottengo?". Affronteremo una situazione comune. JMP produce molti risultati diversi in finestre diverse e, a un certo punto, potresti voler automatizzare l'analisi, personalizzare, modificare la visualizzazione o addirittura estrarre alcune informazioni per ulteriori calcoli. Questo solleva diverse domande. Come posso farlo? Esiste un meccanismo per accedere a questi risultati? Esiste uno strumento che mi aiuti? Infine, dopo quasi un quarto di secolo di scripting JMP, esistono best practice per questo scopo?
Prima di entrare nel vivo della nostra presentazione, vorrei fare un commento. Potete chiedere a JMP di salvare uno script per la vostra piattaforma in qualsiasi momento. Qualsiasi modifica apportata alla visualizzazione viene automaticamente registrata utilizzando l'argomento "Invia a visualizzazione" nello script di avvio della piattaforma. Potrete eseguire questo script in futuro quando vorrete riprodurre quell'analisi e i relativi risultati.
Questo argomento "Invia a schermo" è un meccanismo inventato per consentire a JMP di registrare queste modifiche, ma non è stato concepito per la creazione di script. Vi mostreremo le tecniche progettate in JMP che rappresentano davvero le migliori pratiche.
Innanzitutto, è necessario comprendere che quando si visualizza una finestra in JMP, si osservano in realtà due oggetti che interagiscono tra loro. Il primo oggetto è chiamato livello di analisi ed è responsabile di tutti i calcoli. Si interagisce con il livello di analisi tramite i menu contestuali. Ad esempio, facendo clic su un triangolo si effettua una scelta. L'altro oggetto è noto come livello di report e organizza e visualizza i risultati del livello di analisi.
Vogliamo comunicare con il livello di report. Il modo in cui lo facciamo è tramite un riferimento a un oggetto a cui possiamo inviare un messaggio. Questo livello di report ha una struttura ad albero ramificata e il riferimento iniziale è alla radice di questo albero di visualizzazione. I nodi lungo ciascuno di questi rami sono caselle di visualizzazione JMP. Ora la domanda diventa: come faccio a individuare o identificare la casella di visualizzazione a cui voglio inviare un messaggio? Lo facciamo con un indice. L'indice è racchiuso tra parentesi quadre che seguono il riferimento al livello di report originale. Potrebbe essere necessario utilizzare più di un indice se si dispone di una casella di visualizzazione fortemente nidificata. Questi possono essere indici successivi o un singolo indice con un elenco delle diverse caselle.
L'indice può assumere diverse forme. Può essere assoluto, relativo o condizionale. Per illustrarlo, farò un esempio molto semplice. Apro la grande tabella dati REST. Invio il messaggio per variante alla tabella dati per avviare l'analisi di peso rispetto all'altezza. Ora che ho salvato il riferimento in un oggetto variabile, posso inviargli dei messaggi. Ad esempio, invio il messaggio "fit line" con il numero 1 per abilitare l'analisi e potete vedere il risultato, la retta di adattamento dei minimi quadrati in rosso.
Ma vorrei selezionare la casella in cui è presentato il grafico. Devo chiedere al livello di analisi che utilizza il messaggio di report un riferimento ad esso. Lo salvo. Ora posso assegnare un pedice a quel riferimento; in questo caso, la casella frame uno è il pedice appropriato. Ci arriveremo. Poi posso inviare il messaggio, seleziona. Questo è il modo in cui utilizziamo i pedici.
Parliamo prima dell'indice assoluto. In questo caso, si utilizza un indice che indica quale diramazione prendere mentre si esamina questa struttura ramificata di tutte queste caselle di visualizzazione. Supponiamo che io voglia selezionare quella colonna di numeri nel riepilogo del profilo di adattamento. Parto dalla radice, il riferimento che mi è stato fornito, e comincio a percorrere le diramazioni. Da quella radice, scendo lungo la seconda diramazione, poi la prima, poi la prima e così via. Infine, invio il metodo select.
Come puoi vedere, funziona. Gli script assoluti sono validi ed efficaci, ma sono molto difficili da specificare e altrettanto difficili da leggere. Sono anche inaffidabili. Con questo intendo dire che si rompono facilmente a seconda di varie circostanze, di cosa hai aperto, dell'ordine in cui esegui determinate operazioni e, certamente, degli aggiornamenti di JMP stesso. Non lo consigliamo.
La forma relativa è più facile da specificare e leggere. In questo caso, per arrivare alla stessa colonna di numeri, inizio con report, e poi i miei indici sono i seguenti. Voglio la casella di contorno numero 3, la casella di tabella numero 1, la casella di colonna dei numeri 1. Puoi quasi immaginare cosa stai facendo mentre leggi questo. Il risultato è lo stesso, ma è anche meno fragile.
Il terzo metodo consiste nell'utilizzare il linguaggio di query XPath. In questo caso, inviamo il messaggio XPath al report, che accetta un singolo argomento. Si tratta di una stringa di caratteri che costituisce la stringa di ricerca per ottenere ciò che desideriamo. Anche in questo caso, il risultato è lo stesso dei primi due metodi, ma è il meno fragile. Inoltre, è il più potente e flessibile. Restituisce un elenco di tutte le corrispondenze ed è supportato da numerose funzioni e dalla logica condizionale di questo linguaggio di query.
Questa diapositiva mostra l'inizio del file XML per quella finestra bivariata. Questo è il linguaggio di markup estensibile. Non entreremo nei dettagli, ma l'idea è che questo sia un modo per rappresentare una finestra JMP e il linguaggio di query XPath si basa su questo formato.
Gli alberi di visualizzazione di JMP, ovvero qualsiasi finestra in JMP, possono essere espressi in XML. XML in generale è un modo per taggare e memorizzare dati e attributi gerarchici. JMP implementa la prima versione di questo linguaggio e abbiamo un documento separato che fornisce maggiori dettagli sul linguaggio e altre risorse online.
Quello che vorrei fare ora è illustrarvi alcune delle regole sintattiche di base per darvi un'idea, dopodiché passerò la parola a Tanya per mostrarvi alcuni esempi concreti di come le utilizziamo.
XPath ha anche una forma assoluta, o percorso assoluto. È indicato con una singola barra, seguita dal nome del nodo che si sta cercando. I nodi successivi vengono visualizzati utilizzando più barre. Ma questo non è generalmente il modo migliore per visualizzare gli alberi in JMP, ancora una volta, perché le finestre di JMP sono dinamiche.
Un metodo migliore è il percorso relativo. In questo caso, utilizziamo due barre per identificare il primo nodo. Tale nodo può trovarsi in qualsiasi punto dell'albero di visualizzazione, seguito da nodi aggiuntivi per cercare infine la destinazione desiderata. Non è necessario che siano adiacenti, ovvero rami successivi.
Nella terza riga, vedete un semplice esempio. La stringa di ricerca è per un percorso relativo che cerca un riquadro di contorno. Questo restituirà un elenco di tutti i nodi che si trovano in un riquadro di contorno, quindi è molto potente. D'altra parte, si potrebbe essere più specifici usando un predicato, in questo caso, cosa c'è tra parentesi quadre. Parlerò di questo più in dettaglio, ma questo ci permette di specificare che non vogliamo tutti i riquadri di contorno, ma solo quelli che hanno un titolo, un riepilogo di adattamento.
Sulla stessa linea, abbiamo i caratteri jolly, che ci permettono di specificare alcuni, ma non tutti, i dettagli di una ricerca. Voglio cercare una qualsiasi casella di riepilogo con un titolo che contenga la parola "riassunto". Il titolo potrebbe essere la parola "riassunto", oppure un titolo come "riassunto di adattamento". Troverà tutte le corrispondenze. Possiamo anche usare questo per trovare corrispondenze con tutti i nodi al livello successivo. Outlinebox/* restituirà tutte le caselle di visualizzazione all'interno di tutte le caselle di riepilogo.
Allo stesso modo, non possiamo solo cercare nodi, ma anche attributi. In questo caso, stiamo cercando tutti gli attributi di tutti i riquadri di contorno. La @ è il simbolo dell'attributo, mentre l'asterisco indica uno qualsiasi di essi.
Parliamo ora un po' più approfonditamente dei predicati. I predicati sono indicati tra parentesi quadre. In questo caso, stiamo cercando caselle di testo che hanno un valore, un sommario di adattamento. Ma possiamo fare di più. Nella seconda riga, vedete la stessa ricerca, solo che alla fine non vogliamo tutte le caselle di colonna dei numeri, vogliamo l'ultima. Potete indicare questo tipo di informazione, ad esempio nella terza riga, vogliamo cercare le prime tre caselle di testo. Stiamo usando la funzione di posizione, e deve essere inferiore al valore per la corrispondenza. Può essere non solo qualcosa che riguarda il nodo, ma può riguardare un attributo con quel nodo. Potremmo cercare tutte le caselle di modifica del testo con una larghezza maggiore di 10. Avete questa possibilità a vostra disposizione.
Mentre si effettua una ricerca, a volte si desidera un riferimento a quella casella di visualizzazione, per inviare un messaggio. Altre volte, invece, si desidera il valore o l'attributo in quel nodo. Ecco un esempio. Troveremo tutte le caselle di accesso e, per ciascuna di esse, tutte le caselle di modifica del testo. Invece di restituire un riferimento alla casella di visualizzazione, vogliamo il valore, il testo corrente in quella casella e così via. L'ultima riga qui ci serve per conoscere la larghezza di tutte le caselle di contorno nella finestra.
Infine, vorrei solo parlare del concetto di assi in XPath, che è lo stesso di cui ho parlato prima in termini di ramificazione, passando da un nodo all'altro e di ciò che si trova lungo il percorso, guardando avanti, indietro o lateralmente. Nel primo esempio, cercherò tutti i riquadri degli assi e poi, invece di specificare un certo tipo di nodo, i due punti indicano che voglio i genitori di quei riquadri degli assi.
Stessa cosa nella seconda riga qui: stiamo cercando intestazioni di caselle di colonna numeriche che abbiano una somma di quadrati, e poi voglio il nodo padre di queste. Quella è la casella di colonna numerica vera e propria. Posso usare dichiarazioni esplicite sulla relazione. Nel terzo esempio qui, sto guardando la prima casella immagine e sto cercando un figlio di tipo casella di modifica testo.
Posso procedere in senso opposto. È simile al secondo esempio di questa diapositiva. Sto cercando l'intestazione di una casella di colonna numerica di T-Ratio, quindi voglio trovare un elemento padre di quella casella di visualizzazione di tipo casella di colonna numerica. Hai molta potenza e molta flessibilità. Spesso una semplice stringa di ricerca è adeguata, ma quando necessario, puoi usare predicati e alcuni di questi altri strumenti di sintassi che ho menzionato.
JMP ha alcune funzionalità che possono aiutarti. Se vai al menu di aiuto e cerchi nell'indice degli script, puoi modificare il browser in modo che mostri le caselle di visualizzazione, e troverai tutte le caselle di visualizzazione disponibili, tutti i protocolli associati e la ricerca è possibile.
Inoltre, cliccando con il tasto destro del mouse sul triangolo grigio davanti a un riquadro di contorno, si apre un menu e da lì è possibile selezionare "Mostra albero di visualizzazione" o "Mostra proprietà". Si tratta di strumenti interattivi che aiutano a esplorare l'albero di visualizzazione e a scoprire i valori e gli attributi. Questo può essere molto utile.
Inoltre, il registro di miglioramento è un ottimo modo per visualizzare i risultati delle ricerche e verificare se è necessario apportare ulteriori modifiche. C'è un messaggio JSL, Get XML. A volte è necessario esaminare la rappresentazione XML sottostante. Può essere molto utile. Inoltre, c'è una funzione JSL, Get Display Path, che indica, per una casella di visualizzazione di destinazione, il formato corretto di indice o il formato di percorso XML per fare riferimento a quella casella.
Per me è tutto. Ora passo la parola a Tanya per la nostra dimostrazione dal vivo.
Grazie, Mark. In questo primo caso di studio che voglio esaminare, voglio usare JSL per ottenere i valori trovati in questo report. La prima cosa che devo fare è determinare quale elemento contiene questi valori. Un modo per determinarlo è tramite "Mostra Proprietà".
Mostra proprietà mi dice che i valori medi sono contenuti in una casella di colonna numerica. Questo pannello mostra la struttura ad albero nidificata o ramificata di cui Mark ha parlato in precedenza. Questa casella di colonna numerica fa parte della casella della tabella, che a sua volta fa parte di una casella di struttura, eccetera.
Qui troverete anche il nodo "Path outline". Questo è il codice JSL che potete usare per ottenere il riferimento a questa casella di colonna numerica chiamata media. La modalità predefinita è il metodo indice. Potete anche modificarla in XPath e JMP vi mostrerà il codice XPath per ottenere un riferimento a quella casella di colonna numerica chiamata media.
Una volta determinato quale elemento memorizza le informazioni, è necessario capire quali comandi è possibile inviare a quell'elemento. Un modo per farlo è tramite l'indice di scripting. Quando cerchiamo la casella della colonna numerica, possiamo scoprire che ci sono vari messaggi get che possiamo inviargli. Quello che userò qui è get come matrice.
Utilizzerò diversi metodi per ottenere queste informazioni. Il primo metodo che utilizzerò è quello che inserisco nel mio report. L'RPT è il livello del report di cui Mark ha parlato in precedenza. All'interno del mio report, cercherò la prima casella della colonna numerica e otterrò quei valori come matrice. Posso vedere quei valori qui sotto nel mio registro. Se guardo di nuovo il mio report, vedo che sono gli stessi valori.
Successivamente, userò un comando XPath per ottenere le stesse informazioni. Questa volta, cercherò il titolo della casella "Riepilogo variabili per misurazioni". Cercherò la casella della colonna numerica con l'intestazione "media" e la otterrò come matrice.
Infine, userò un po' di indicizzazione relativa. Nel mio report, cercherò il riepilogo della variabilità per la misurazione e la casella della colonna dei numeri chiamata media, e otterrò il risultato come matrice.
Ora, sebbene ottenga gli stessi risultati usando tutti e tre i metodi, il primo metodo è quello che sconsigliamo. Non è molto robusto. Se in futuro JMP dovesse modificare il report e aggiungere un'altra casella di colonna numerica davanti a me, l'esecuzione di questo codice non mi fornirebbe più i risultati che mi aspetto di ottenere.
Questi ultimi due esempi rappresentano modifiche piuttosto robuste. L'esempio relativo che ho mostrato per ultimo è più breve dell'esempio XPath. Questo accade normalmente quando si estrae un solo elemento dal report. XPath dà il meglio di sé quando si estraggono più elementi alla volta, o quando si fa qualcosa di complesso con i caratteri jolly e i predicati, come quello menzionato da Mark in precedenza.
Diamo un'occhiata a un esempio più complesso. In questo caso di studio, vogliamo estrarre le informazioni riepilogative sui limiti per entrambe le risposte. Abbiamo due risposte e vogliamo le informazioni da entrambe. Possiamo farlo utilizzando l'indicizzazione relativa con due colonne.
Nel nostro livello di report, possiamo cercare i riepiloghi dei limiti di peso nella prima casella della tabella che appare sotto e ottenere tali informazioni. Possiamo quindi impostare un secondo comando per cercare i riepiloghi dei limiti di peso nella prima casella della tabella e ottenere tali informazioni.
In alternativa, possiamo utilizzare un singolo comando X Graph. Nel nostro livello di report, possiamo cercare la casella di riepilogo denominata "Costruttore di grafici di controllo". La vedete qui sopra. Possiamo cercare tutte le caselle di tabella che appaiono sotto "Costruttore di grafici di controllo" e ottenere tali informazioni.
Scrivendo quel codice, vediamo molte più informazioni nel log del previsto. Quello che vedete qui sono le caselle di tabella che appaiono nel vostro report, così come le caselle di tabella invisibili. Ci sono altre caselle di tabella che fanno parte di questo report, ma non abbiamo ancora aggiunto queste informazioni al nostro livello di report, come i limiti aggiunti o il report Sigma. Possiamo aggiungere alcune informazioni alla nostra istruzione XPath per maggiore visibilità.
Per tutte queste caselle di tabella, vogliamo esaminare la casella stessa e i suoi predecessori, e vogliamo vedere se sono visibili o meno. Per questo particolare codice, stiamo cercando la visibilità "false", ma abbiamo anche un'istruzione "not" qui sopra. In sostanza, quello che sto cercando sono le mie caselle di tabella visibili nel report. Quando eseguo questo, vedo che ottengo le stesse informazioni che ho ottenuto sopra con le mie due istruzioni separate. XPath mi ha permesso di ottenere queste informazioni tramite un'unica istruzione anziché due istruzioni separate.
Per questo prossimo caso di studio, sto creando un profiler di previsione e ho massimizzato la desiderabilità. Voglio ottenere i valori Y rossi e i valori X rossi presenti in questo report. Poiché sono entrambi valori degli assi e sono entrambi rossi, si potrebbe pensare che siano memorizzati nello stesso elemento. Tuttavia, non è così.
Possiamo verificarlo tornando alla finestra "Mostra Proprietà". Se clicco sulla voce giusta, ecco fatto: i valori Y sono in realtà caselle di testo e i valori X sono caselle di modifica numeriche. Per prima cosa, lavoriamo con le nostre caselle di testo. Cercheremo il profiler di previsione tramite XPath, quindi cercheremo le nostre caselle di testo visibili. Ancora una volta, abbiamo dovuto aggiungere del codice per la visibilità perché ci sono alcune caselle di testo che non vediamo nel nostro report e che non vogliamo visualizzare.
Eseguendo il codice, vediamo che non solo otteniamo i valori rossi, ma anche i valori blu per gli intervalli di confidenza, e questo perché sono anch'essi memorizzati come caselle di testo. Possiamo aggiungere un ciclo for per scorrere ogni elemento e acquisire solo i valori rossi, uno ogni tre, e memorizzare queste informazioni in una matrice.
Ora abbiamo i nostri valori Y che erano in rosso, ma vogliamo anche i nostri valori X che erano in rosso. Questi erano memorizzati in caselle di modifica numerate. Possiamo usare un'istruzione XPath per cercare un profiler di previsione nelle caselle di modifica numerate e vogliamo ottenere quei valori come matrice. Abbiamo quei valori nel nostro registro qui sotto.
Per questo prossimo caso di studio, voglio ottenere tutti i valori Y per ogni linea che fa parte di questo primo riquadro o di questo grafico di posizione, il diametro medio. Quando guardi "Mostra Proprietà", scoprirai che non puoi accedere a questo livello del riquadro. Quando clicco qui, mi viene mostrato un riquadro, ma non riesco a vedere cosa c'è al suo interno. Ho bisogno di sapere come questi valori sono memorizzati nel mio riquadro. Un altro metodo per ottenere queste informazioni è utilizzare "Mostra Struttura ad Albero".
In "Mostra struttura ad albero", vedo anche la struttura ramificata di cui Mark ha parlato prima. All'interno di questo riquadro, vedo che ci sono vari segmenti. Ciò che mi interessa sono questi segmenti di linea che appaiono qui sotto. Posso usare un'istruzione XPath per ottenere tutti i segmenti di linea dal primo riquadro.
In precedenza, tutte le mie istruzioni XPath avevano un nodo di tipo "contorno". Questa no. Non è realmente necessario in Control Chart Builder. Tutti i grafici in Control Chart Builder appaiono sotto questo "contorno", anche se si hanno più risposte. Pertanto, non ne ho realmente bisogno, non è necessario.
Se eseguo questo, vedo che ci sono sette elementi. Posso quindi scegliere di utilizzare un array associativo per ottenere i valori Y da questi elementi. Dopo averlo eseguito, vedo che i miei valori Y per la media aggiunta sono 4,2, il mio valore Y per il limite inferiore aggiunto è 4,1 e così via.
Per questo prossimo caso di studio, ho tre grafici diversi. Voglio che l'asse Y di ciascuno di questi grafici abbia lo stesso minimo e massimo e che aggiunga la stessa linea di riferimento a ciascun grafico. Per prima cosa, devo ottenere un handle per il riquadro degli assi. Userò XPath per cercare il nodo del contorno del gruppo di adattamento. Poi cercherò tutti i riquadri degli assi visibili.
Vedo che ho sei caselle di assi diverse. Ci sono tre grafici, un asse X e un asse Y ciascuno, quindi sono sei. Userò un ciclo for per scorrere ciascuno di questi valori. Solo per l'asse Y, imposterò il minimo a un valore, il massimo a un valore e aggiungerò una linea di riferimento. Ora, per ciascuno dei miei tre grafici, ho aggiunto una linea di riferimento e ho impostato il minimo e il massimo allo stesso valore.
Per il prossimo esempio, voglio abbreviare questo Rapporto Riepilogo Capacità Sigma complessivo. Voglio vedere solo ciò che appare fino a PP. Non voglio vedere CPM o questi valori attesi o questi valori osservati. Posso farlo tramite XPath. Invierò un comando di riquadro di contorno al mio livello di report. Cercherò il Rapporto Riepilogo Capacità Sigma complessivo.
Dopo aver ottenuto un riferimento a quel livello del report, voglio usare XPath per selezionare le caselle di intestazione che iniziano con "previsto", "osservato" o "uguale a CPM". Dopo averle selezionate, invio il comando di riduzione della visibilità. Ora vedo che quei valori sono scomparsi dal report. È importante non eliminare elementi dal report. L'eliminazione di elementi dal report potrebbe avere conseguenze impreviste. Ti consigliamo di comprimere o nascondere elementi nel report anziché eliminarli.
Un ultimo esempio. Per questo caso di studio, abbiamo inserito la piattaforma "Gestisci limiti" in una nuova finestra e vogliamo eliminare il pulsante di aiuto. Quando si creano script JSL, spesso lo si fa perché si desidera condividere i risultati con altri. Pertanto, è necessario assicurarsi che lo script funzioni allo stesso modo sul proprio computer e su quello di qualcun altro.
Windows e Macintosh hanno spesso pulsanti in posizioni diverse. Non si dovrebbe mai cercare un pulsante in base alla posizione nel report. Si dovrebbe cercare un pulsante in base al suo nome piuttosto che alla sua posizione. Non entrerò nel codice del gestore della finestra with qui, ma ciò su cui voglio attirare la vostra attenzione è questa istruzione XPath. Sto cercando la casella del pulsante intitolata "help", quindi ne riduco la visibilità. Vedrete che il pulsante "help" non è più qui sotto. Ancora una volta, l'ho semplicemente premuto. Non voglio eliminarlo dal nostro report perché non voglio avere conseguenze inaspettate.
Vi ho mostrato tre diversi metodi per ottenere valori dal report. L'indicizzazione assoluta non è un buon metodo da usare, non è robusto alle modifiche. Il metodo XPath e l'indicizzazione relativa sono piuttosto robusti. Se si ottiene solo un singolo valore dal report, l'indicizzazione relativa è probabilmente un codice più breve e semplice. Il codice XPath è utile quando si raccolgono più informazioni contemporaneamente e se si desidera utilizzare caratteri jolly e simili.
Spero che queste informazioni ti siano state utili e che tu sia pronto a tornare a scrivere qualche sceneggiatura.