
Questa dimostrazione esaminerà alcune delle funzionalità di base di liste e matrici. Inizierò con le liste. Aprirò una nuova finestra dell'editor di script. La scorciatoia da tastiera è Ctrl+T. La ridimensionerò e la riordinerò. Proseguirò portando il registro davanti al registro. Creerò una variabile che chiamerò "lista". Le assegnerò i risultati della funzione lista. Aprirò la parola "lista" tra parentesi e userò le variabili a, b. Poi calcolerò la radice quadrata di "sqrt" e poi tra parentesi. Proseguirò riformattando solo per inserire le maiuscole e la spaziatura. Eseguirò lo script. Ciò che appare nel registro è semplicemente l'informazione che è stata assegnata una lista con tre elementi. Se passo il mouse sulla mia lista, quello che vediamo è che memorizza gli elementi che ho inserito senza valutazione. Quindi sono le due variabili e la funzione radice quadrata. Su una nuova riga nella finestra del mio Script Editor, richiederò la valutazione degli elementi nella mia lista. Quindi digiterò eval list tra parentesi quadre aperte. Ed eseguirò solo quella riga. E così vedrò i risultati valutati. Ora, la mia lista rimane non valutata. Quindi, se volessi lavorare con i risultati di eval list, una cosa sarebbe assegnare il risultato della valutazione della lista a una nuova lista. Ci sono altri modi in cui possiamo usare gli indici, tuttavia, per lavorare con gli elementi valutati dalla lista. Quindi, prima di parlarne, lasciatemi parlare dell'indicizzazione della lista in generale. Quindi andrò su una nuova riga. E digiterò il mio list tra parentesi quadre aperte. E digiterò a per estrarre il secondo elemento dalla lista. E se eseguo solo quella riga, quello che vedo è l'elemento non valutato. E se volessi il risultato valutato? Beh, posso effettivamente tornare alla mia seconda riga qui. Posso richiedere la valutazione del mio elenco e quindi mettere il risultato in pedice. Quindi inserisco una parentesi quadra aperta, una a dentro, e chiudo la parentesi quadra. Eseguo di nuovo solo quella riga, usando il tasto Invio sul tastierino numerico all'estrema destra della tastiera del mio computer desktop. Ecco, ho appena messo in pedice l'elenco valutato per ottenere quel risultato. Abbiamo parlato di modificare gli elenchi. Quindi voglio andare a una nuova riga. E userò "Insert into". Quindi "Insert into" modificherà l'elenco sul posto. Quindi apro le parentesi. E quale elenco sto modificando? Beh, è memorizzato nel mio elenco. Questo è il primo argomento. Cosa voglio aggiungere? Aggiungerò il nome John. Quindi è una stringa di caratteri. E se non metto quella virgola lì e non fornisco il terzo argomento, lo mette semplicemente alla fine dell'elenco. Ma avrò la virgola e digiterò "a" come terzo argomento facoltativo per metterlo in seconda posizione. E poi, eseguo solo quella riga. E insert into in realtà non restituisce nulla al log. Ma se passo il mouse sopra la mia lista in qualsiasi punto dello script, potete vedere che è stata modificata per avere il nome John in seconda posizione. Ora, supponiamo di avere una lista, forse restituita da una funzione JSL o usata per raccogliere input utente, ad esempio. E devo trovare un elemento nella lista per poterlo rimuovere. So che è... beh, non so se è nella lista. Voglio prima verificare se è nella lista. E poi, se lo è, voglio poterlo rimuovere. Quindi creerò una variabile per memorizzare la posizione dell'elemento John. La chiamerò pos. E le assegnerò il risultato della funzione contains. Abbiamo visto contains con stringhe di caratteri. Ora contains con una lista. Stiamo cercando nella mia lista la stringa di caratteri John, e ovviamente farà distinzione tra maiuscole e minuscole. E se eseguo quella riga, il risultato restituito e memorizzato nella variabile pos è . Quindi, se volessi rimuoverlo dall'elenco, ad esempio, potrei digitare remove tra parentesi aperte. Stiamo cercando nel mio elenco. E invece di rimuovere semplicemente l'ultimo elemento, che è ciò che otterrei se non fornissi nulla dopo il primo argomento, userò la variabile pos. Ed eseguo quella riga. E questo restituisce un elenco con il numero di elementi rimossi. Per impostazione predefinita, ne prendiamo uno a partire dalla posizione specificata nel secondo argomento. Quindi ottengo un elenco che contiene quella stringa di caratteri. E potrei effettivamente assegnare quel risultato a una sua variabile se volessi utilizzare quell'elemento dell'elenco altrove nel mio script. E potrei anche estrarlo dall'elenco in cui viene restituito indicizzandolo con un . Quindi, per ora, il mio elenco non contiene più John. Eseguirò di nuovo la mia riga. Il valore memorizzato in pos sarà ancora lo stesso. E ora eseguo la riga E, in modo che venga restituita la stringa di caratteri non presente nell'elenco. Se passo il mouse sull'elenco, possiamo vedere che è stato riportato al suo valore precedente. Parliamo un po' di matrici. Farò clic con il pulsante destro del mouse sul registro per cancellarlo, quindi selezionerò tutto nella finestra dell'Editor di script ed eliminerò tutto. Quindi inizierò simulando delle persone, che saranno le mie righe nella mia matrice. E ognuna di queste persone lancerà un dado a sei facce per cinque volte. E quelle saranno le mie colonne. E le genererò con un generatore di numeri casuali, ma inizierò con un valore iniziale specifico in modo che, se seguite il procedimento, otterrete esattamente gli stessi numeri casuali. E useremo una funzione chiamata funzione j, che crea una matrice con un numero specificato di righe e colonne. Questi sono i suoi primi due argomenti e poi, quale sarà il valore nella matrice, questo è il terzo argomento. Quindi userò la funzione di reset casuale con un valore di E, di nuovo, questo serve solo a specificare il mio seed iniziale per il generatore di numeri casuali. Quindi andrò avanti ed eseguirò questo. E poi, su una nuova riga, creerò una variabile m, a cui verrà assegnato il risultato della funzione j. Di nuovo, inizio con il numero di righe in cui simuliamo le persone e poi il numero di colonne, lanciando un dado a sei facce cinque volte. E userò la funzione di intero casuale con gli argomenti: inizieremo da e selezioneremo numeri casuali fino a E, di nuovo, posso riformattare questo solo per farlo sembrare un po'... oops, l'ho eseguito invece di riformattarlo. Posso ancora riformattarlo. Ecco fatto. Quindi è anche eseguito ora. E se ingrandiamo un po' il logaritmo, potete vedere che ho quella matrice riga per colonna. E come faccio a fare riferimento agli elementi in quella matrice? Beh, usiamo gli indici. Quindi andrò a una nuova riga. Forse mi interessa sapere cosa ha ottenuto la quinta persona al terzo lancio del dado. Quindi metterò un pedice al nome della variabile m, quindi m e poi parentesi quadre. per il numero di riga, virgola, per il numero di colonna, chiudo la parentesi quadra ed eseguo quella riga. E così la quinta persona al terzo lancio ha ottenuto un. E possiamo effettivamente verificarlo. Quindi c'è uno, due, tre, quattro, c'è la quinta riga e c'è il terzo lancio del dado. Ora, cosa succede se voglio trovare un'intera riga o un'intera colonna? Beh, su una nuova riga qui - in realtà, userò la stessa riga e sostituirò semplicemente il pedice nella mia riga. Diciamo che voglio tutte le righe. Quindi digito per il primo pedice. E poi dopo la virgola, digiterò un per indicare che non voglio che selezioni nessuna colonna in particolare. Questo sarà riga per ogni colonna. E posso eseguirlo. E questo mi dà tutti i valori della riga. E potremmo, se vuoi scorrere verso l'alto, verificare che quelli siano effettivamente i valori nella riga. Quindi questo è, in effetti, ciò che restituiamo. Potrei fare la stessa cosa per selezionare una colonna dove avrei solo a per l'indice di riga e poi qualsiasi numero di colonna. Ma supponiamo di voler eliminare un'intera riga. Diciamo che decido che la terza persona in qualche modo ha barato nel lancio del dado. Quindi metterò m in indice con a e a. E poi, prima del punto e virgola, assegnerò a quella riga il valore di una matrice vuota. Quindi apro e chiudo le parentesi quadre. E se eseguo quella riga, ciò che viene restituito al registro è una matrice vuota. E se passo il mouse su m e vuoi contare le righe, puoi vedere che ora ci sono solo nove righe. Ora, di nuovo, solo per sperimentare con alcune delle cose che possiamo fare con le matrici, supponiamo che le nove persone rimanenti lancino il dado per la sesta volta ciascuna. Quindi farò questo sul posto. Gli operatori, avrò m. E poi l'operatore di assegnazione sarà Concat. Quindi ci saranno le doppie barre verticali e un segno di uguale. Niente spazi, perché non possiamo avere spazi tra i componenti di questi operatori che hanno più caratteri. E userò di nuovo la funzione j. E abbiamo solo nove righe. E voglio una colonna. E userò di nuovo un intero casuale. E per i suoi argomenti è ancora un dado a sei facce, quindi fornirò... Quindi questo modificherà m aggiungendo una sesta colonna quando eseguo quella riga. E quindi ora potete vedere che abbiamo sei colonne nella matrice. Svuotiamo il registro. E ricomincerò assegnando valori a m. Non userò più numeri casuali. Quindi pulirò il contenuto della finestra dell'editor di script. Inizializzerò una variabile contatore i e le assegnerò il valore di... Quindi la eseguirò solo per inizializzarla. E poi su una nuova riga, assegnerò una matrice diversa a m. Quindi a m verrà assegnato il risultato della funzione j. Avrà cinque righe. Questa matrice avrà cinque righe, cinque colonne e, partendo da incrementerà i di per ogni elemento della matrice. Quindi userò l'operatore i più più, quell'operatore di post-incremento che aggiunge sul posto. E lo eseguirò. E quindi avrò una matrice per. E notate che stiamo incrementando per riga, non per colonna. E questo è importante per un altro metodo di indicizzazione che vedremo a breve. Quindi incrementiamo per riga. Ora, cosa succede se voglio una sequenza che arrivi effettivamente a... Beh, ci sono sicuramente molti modi diversi per farlo. Ma un modo rapido sarebbe semplicemente moltiplicare ogni elemento della matrice che ho appena creato per... E ancora, possiamo vettorizzare queste operazioni. Non devo eseguire un ciclo nella matrice. Assegno semplicemente... E farò un'altra assegnazione sul posto... m e poi l'asterisco è uguale a, quindi la moltiplicazione per... Non dobbiamo farlo sul posto. Ma invece di creare una nuova variabile, farò così. Quindi, di nuovo, non devo fare un ciclo. Moltiplicherà tutto elemento per elemento, moltiplicando tutto per [numero mancante]. E lo eseguo. E quindi ecco quella matrice che va da [numero mancante] a [numero mancante] con incrementi di [numero mancante]. Ora, un altro modo per creare questa matrice sarebbe in due passaggi, iniziando con la funzione indice. Quindi cancellerò il contenuto della finestra dello Script Editor. Proseguirò e cancellerò anche il log. E nella finestra dello Script Editor, digiterò m. E a questo verrà assegnato il valore risultante dalla funzione indice: indice parentesi aperta. E inizieremo da [numero mancante]. Conteremo fino a [numero mancante]. Il terzo argomento facoltativo, che userò qui, è l'incremento. Quindi andremo per [numero mancante]. Ecco il primo passaggio per creare quella matrice che avevamo la matrice per [numero mancante]. Quindi creiamo un vettore riga usando la funzione indice. E poi, posso dargli forma. Quindi andrò a una nuova riga. Sovrascriverò di nuovo m. Quindi m sarà il risultato della funzione di forma, che accetterà m come primo argomento e ne modificherà le dimensioni per avere cinque righe e cinque colonne. Bisogna fare molta attenzione con questa funzione di forma. Se il vettore riga in questo caso non corrisponde a una matrice quadrata che ho specificato qui, JMP troncherà questo vettore se la matrice specificata con la forma è troppo piccola. Oppure, se si specifica una matrice più grande, inizierà semplicemente a ripetere il vettore. Quindi, siate cauti quando usate la funzione di forma. Voglio eseguirla. Ed ecco di nuovo quella matrice quadrata, che va da a con incrementi di Ora, uno dei motivi per cui volevo farlo, oltre al fatto che di solito ci sono molti modi per fare tutto in JMP, è per parlare di un altro modo di indicizzare. Abbiamo visto gli indici riga per colonna. E voglio parlare dell'indice singolo che a volte vedrete. Quindi, se volessi... possiamo usare la funzione contains con... l'abbiamo vista con le stringhe di caratteri. Potete usarla con gli elenchi. Possiamo usarlo con le matrici. Se voglio trovare la posizione del numero nella matrice attualmente memorizzato m, beh, se lo stessi descrivendo direi, OK, è riga colonna. Quindi userei una virgola indicizzata. Ma se chiedessi a JMP di trovarla per me, userei semplicemente "contiene". E ancora, in pratica, il tuo script potrebbe assegnare questo risultato a una variabile. Non ho bisogno di farlo qui: contiene e poi m virgola. JMP non mi darà il risultato. Mi darà un singolo valore. Bene, come funziona quel singolo valore? Il singolo valore indicizzato... quindi se tornassi indietro... andrei a una nuova riga qui e digiterei m e poi le parentesi quadre con un singolo valore indicizzato e lo eseguirò. Questo è... Il singolo valore indicizzato tratterà la mia matrice come se fosse un vettore riga e inizierà a contare dalla prima posizione. Quindi, quando torniamo nel log per vedere il risultato della mia funzione indice, quel singolo indice lo tratta come un vettore di riga e conta riga per riga, proprio come abbiamo incrementato riga per riga, per ottenere la posizione di quel valore. E vedremo altri esempi, quando lavoreremo con le matrici più avanti, in cui JMP ci restituisce quel singolo indice. L'ultima cosa che faremo qui è solo una sorta di calcolo arbitrario per illustrare che ci sono funzioni che possono accettare matrici come argomenti, funzioni di calcolo, quindi abbiamo già visto la funzione forma e contiene. Ma andrò avanti su una nuova riga qui e digiterò log e poi m come argomento diviso per E l'altra cosa su questo esempio... beh, lasciatemi eseguirlo. E poi vi dirò l'altra cosa sull'esempio. Quindi ho appena eseguito quel calcolo su ogni elemento e diviso per Ma l'altra cosa che voglio solo menzionare è che in JSL le funzioni possono accettare funzioni come argomenti. Lo vedremo più avanti. Abbiamo già visto alcuni esempi. Quindi questo operatore di divisione, questa è in realtà la funzione di divisione che prende il logaritmo di m come argomento e poi... E non ho dovuto calcolare il logaritmo di m e memorizzarlo in una variabile da fornire alla funzione di divisione. Posso eseguire questo calcolo direttamente. E ancora, quello che apparirebbe se scrivessi la funzione sarebbe: divisione, parentesi aperta. Sostituisci l'operatore con una virgola e parentesi chiusa. Quindi non devo fornire una variabile che memorizzi questi valori. Posso calcolarli mentre eseguo la funzione di divisione. Quindi questi sono diversi esempi di liste e matrici e alcuni dei modi in cui possiamo lavorare con quei particolari tipi di strutture dati.