L'indicizzazione in una matrice (o un elenco) con un'altra matrice (o elenco) è una tecnica potente per rendere gli script veloci e piccoli, ma c'è un caso limite di cui preoccuparsi che stiamo risolvendo per JMP 13. Forse dovrei mettere "correzione" tra virgolette perché qualsiasi modifica è una potenziale interruzione, motivo per cui voglio spiegarlo qui prima di JMP 13.
Ecco un esempio di utilizzo di una matrice come indice in una colonna di dati.
Open("$SAMPLE_DATA/Big Class.jmp");
tall rows = Loc(:height << Get Values() >= 67); // [25, 27, 30, 37, 39, 40]
:height[tall rows]; // [68, 69, 67, 68, 68, 70]
N Rows(:height[tall rows]); // 6
Se non hai familiarità con questo stile di programmazione, la seconda riga è la chiave. " :altezza << Ottieni valori() " restituisce i valori della colonna altezza come matrice. Il confronto " >= 67 " restituisce una matrice di 0 e 1 corrispondenti a dove l'espressione è falsa (0) o vera (1). Il Loc() La funzione restituisce le posizioni degli 1 all'interno della matrice precedente.
In questo caso otteniamo [25, 27, 30, 37, 39, 40] come numeri di riga in cui l'altezza della colonna è maggiore o uguale a 67. È abbastanza utile di per sé, ma il vero potere deriva dalla possibilità di utilizzare quella matrice come indice in una colonna o altra matrice come nella terza e quarta riga.
L'alternativa a questa tecnica sarebbe scrivere un ciclo For() per scorrere esplicitamente ogni riga. Naturalmente, in entrambi i casi JMP esegue ancora il ciclo delle righe, ma è molto più veloce se eseguito internamente piuttosto che in JSL. E il JSL è più compatto senza il ciclo esplicito.
Possiamo fare la stessa cosa con una variabile matrice invece di un riferimento a una colonna di dati:
m = :height << Get Values();
tall rows = Loc(m >= 67); // [25, 27, 30, 37, 39, 40]
m[tall rows]; // [68, 69, 67, 68, 68, 70]
N Rows(m[tall rows]); // 6
Tutto fantastico finora. Diamo un'occhiata agli stessi esempi con un taglio di altezza diverso (70 invece di 67):
tall rows = Loc(:height << Get Values() >= 70); // [40]
:height[tall rows]; // [70]
N Rows(:height[tall rows]); // 1
m = :height << Get Values();
tall rows = Loc(m >= 70); // [40]
m[tall rows]; // 70
N Rows(m[tall rows]); // error
Che cosa è andato storto? Si noti che data[tall rows] ha restituito 70 invece di [70]. In molti casi, una matrice 1x1 e un numero vengono trattati allo stesso modo, ma non sempre. La funzione N Rows() è un esempio in cui fa la differenza. L'indicizzazione sta "semplificando" in modo troppo aggressivo la matrice 1x1 in un numero.
Una soluzione è chiamare è matrice() prima di usare N righe() . Un altro è concatenare una matrice vuota al risultato, che creerà una matrice se la sorgente è un numero o una matrice:
m = m |/ [];
In JMP 13, la matrice 1x1 viene mantenuta in modo che il risultato dell'operazione sull'indice sarà una matrice ogni volta che l'indice stesso è una matrice . Lo stesso vale per l'indicizzazione degli elenchi e già applicato all'indicizzazione delle colonne di dati.
Ci aspettiamo che l'interruzione sia rara poiché il trigger non è comune e una matrice 1x1 e un numero sono spesso trattati allo stesso modo comunque. Tuttavia, il debugger di JMP 13 sarà in grado di identificare i punti degli script che potrebbero essere interessati dalla modifica.
Se hai commenti o dubbi, faccelo sapere qui o contattaci danielvalente per vedere se sei idoneo per il programma Early Adopter di JMP 13 per provare la modifica sul tuo codice.
Come posso disattivare l'avviso di interruzione per questo nel debugger?Devo continuare a fare clic su Riproduci più e più volte e sembra che il profiler non funzioni.Si blocca e non riesco più a premere play.
*MODIFICA* Non importa.Ho trovato l'opzione per questo.Grazie
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />Sono d'accordo, bene avere un'indicizzazione uniforme.Mi piace il fatto che si possano creare matrici vuote con la forma.
Grande miglioramento. Ecco un altro suggerimento per le matrici: semplificare l'indicizzazione quando si utilizza un condizionale. Questo è meglio spiegato attraverso un esempio. Diciamo che ho una matrice che voglio trovare e restituire i valori maggiori di 5:
mymatrix = [2,4,6,8,10];
newmatrix=mymatrix[loc(mymatrix>5)];
Confronta questo con un codice simile in R:
mymatrix = matrix(cbind(2,4,6,8,10));
newmatrix=mymatrix[mymatrix>5];
OK, la prima istruzione in R è più lunga e la seconda istruzione restituisce un vettore anziché una matrice, ma la seconda istruzione è più breve. Sarebbe bello se JMP potesse implementare la sintassi più semplice nella seconda istruzione nelle versioni future.
Concordo sul fatto che la nuova gestione della matrice a valore singolo sia un miglioramento, ma appoggio anche la richiesta di Mark Bailey per l'eliminazione dell'output confuso della matrice vuota [](0,1). Sostituirlo con [] sarebbe più facile da capire e da gestire per l'utente. Di solito uso una logica come la seguente per gestire questa situazione:
dt=current data table();
rows_to_capture=dt<<GET rows="" where=""></GET>
Distingue tra diverse matrici vuote con una dimensione diversa da zero; a volte la forma è importante:
show(x00,nrows(x00),ncols(x00));
show(x10,nrows(x10),ncols(x10));
show(x01,nrows(x01),ncols(x01));
show(x11,nrows(x11),ncols(x11));
x00 = [];
N Rows(x00) = 0;
N Cols(x00) = 0;
x10 = [](1, 0);
N Rows(x10) = 1;
N Cols(x10) = 0;
x01 = [](0, 1);
N Rows(x01) = 0;
N Cols(x01) = 1;
x11 = [1];
N Rows(x11) = 1;
N Cols(x11) = 1;
Abbiamo un caso nel nostro corso di scripting avanzato in cui il risultato è la matrice vuota ma ciò che viene effettivamente restituito è [](0,1) ..Questa forma sembra essere innocua (ovvero si comporta come una semplice matrice vuota) ma ha sempre richiesto una spiegazione. Cosa fa il (0,1) rappresentare e come verrebbe utilizzato? Se non rappresenta nulla o non ha alcuno scopo, considera la possibilità di rimuoverlo.
Ho un sacco di codice in atto che deve gestire questa eccezione.Questo è un netto miglioramento.Grazie per l'avviso, darò un'occhiata a come influenzerà l'attuale modello di codice che ho usato per gestire questa situazione.
Apprezzo l'avvertimento.......questa è la direzione giusta.....
Questo è un grande passo nella giusta direzione.