La indexación en una matriz (o una lista) con otra matriz (o lista) es una técnica poderosa para hacer que los scripts sean rápidos y pequeños, pero hay un caso límite que preocupa y que estamos arreglando para JMP 13. Tal vez debería poner "arreglar" entre comillas porque cualquier cambio es una interrupción potencial, razón por la cual quiero explicarlo aquí antes del JMP 13.
Este es un ejemplo del uso de una matriz como índice en una columna de datos.
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
Si no está familiarizado con este estilo de programación, la segunda línea es la clave. " :altura << Obtener valores() " devuelve los valores de la columna de altura como una matriz. La comparación " >= 67 " devuelve una matriz de 0 y 1 correspondiente a donde la expresión es falsa (0) o verdadera (1). Él ubicación() La función devuelve las ubicaciones de los 1 dentro de la matriz anterior.
En este caso obtenemos [25, 27, 30, 37, 39, 40] como los números de fila donde la altura de la columna es mayor o igual a 67. Eso es bastante útil por sí mismo, pero el poder real proviene de poder usar esa matriz como índice en una columna u otra matriz como en la tercera y cuarta línea.
La alternativa a esta técnica sería escribir un bucle For() para recorrer cada fila de forma explícita. Por supuesto, JMP sigue recorriendo las filas en cualquier caso, pero es mucho más rápido si se hace internamente que en JSL. Y el JSL es más compacto sin el bucle explícito.
Podemos hacer lo mismo con una variable de matriz en lugar de una referencia de columna de datos:
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
Todo genial hasta ahora. Veamos los mismos ejemplos con un límite de altura diferente (70 en lugar de 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
¿Qué salió mal? Observe que data[tall rows] devolvió 70 en lugar de [70]. En muchos casos, una matriz 1x1 y un número se tratan de la misma manera, pero no siempre. La función N Rows() es un ejemplo en el que marca la diferencia. La indexación "simplifica" demasiado agresivamente la matriz 1x1 en un número.
Una solución es llamar es matriz() antes de usar N filas() . Otra es concatenar una matriz vacía al resultado, lo que creará una matriz ya sea que la fuente sea un número o una matriz:
m = m |/ [];
En JMP 13 se mantiene la matriz 1x1 de manera que el resultado de la operación de índice será una matriz siempre que el índice mismo sea una matriz . Lo mismo se aplica a la indexación de listas y ya se aplica a la indexación de columnas de datos.
Esperamos que la interrupción sea rara, ya que el factor desencadenante no es común y, de todos modos, una matriz 1x1 y un número a menudo se tratan de la misma manera. No obstante, el depurador JMP 13 tendrá la capacidad de identificar lugares en sus scripts que podrían verse afectados por el cambio.
Si tiene algún comentario o inquietud, háganoslo saber aquí o comuníquese con danielvalente para ver si es elegible para el programa JMP 13 Early Adopter para probar el cambio en su propio código.
¿Cómo desactivo la advertencia de interrupción para esto en el depurador?Tengo que seguir haciendo clic en reproducir una y otra vez y parece que el generador de perfiles no funciona.Simplemente se atasca y ya no puedo presionar reproducir.
*EDITAR* No importa.Encontré la opción para ello.Gracias
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />Estoy de acuerdo, bueno tener una indexación uniforme.Me gusta el hecho de que uno puede crear matrices vacías con forma.
Gran mejora. Aquí hay otra sugerencia para matrices: simplifique la indexación cuando esté usando un condicional. Esto se explica mejor a través de un ejemplo. Digamos que tengo una matriz que quiero encontrar y devolver los valores mayores que 5:
mymatrix = [2,4,6,8,10];
newmatrix=mymatrix[loc(mymatrix>5)];
Compare esto con un código similar en R:
mymatrix = matrix(cbind(2,4,6,8,10));
newmatrix=mymatrix[mymatrix>5];
Bien, la primera declaración en R es más larga y la segunda declaración devuelve un vector en lugar de una matriz, pero la segunda declaración es más corta. Sería bueno si JMP pudiera implementar la sintaxis más simple en la segunda declaración en futuras versiones.
Estoy de acuerdo en que el nuevo manejo de la matriz de valor único es una mejora, pero también apoyo la solicitud de Mark Bailey de eliminar la confusa salida de matriz vacía [](0,1). Reemplazarlo con [] sería más fácil de entender y manejar para el usuario. Usualmente uso lógica como la siguiente para manejar esta situación:
dt=current data table();
rows_to_capture=dt<<GET rows="" where=""></GET>
Distingue entre diferentes matrices vacías con una dimensión distinta de cero; a veces la forma es 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;
Tenemos un caso en nuestro curso avanzado de secuencias de comandos donde el resultado es la matriz vacía pero lo que en realidad se devuelve es [](0,1) ..Esta forma parece ser inofensiva (es decir, se comporta como una simple matriz vacía) pero siempre requería una explicación. Lo que hace el (0,1) representan y cómo se usaría? Si no representa nada ni sirve para ningún propósito, considere eliminarlo.
Tengo mucho código en el lugar que tiene que manejar esta excepción.Esta es una mejora definitiva.Gracias por el aviso, veré cómo afectará el patrón actual de código que usé para manejar esta situación.
Agradezco el aviso... esta es la dirección correcta...
Este es un gran paso en la dirección correcta.