El uso más común del lenguaje de scripts JMP es la automatización del trabajo. Quizás el segundo uso más común sea la extracción de resultados de ventanas JMP. Es fácil hacerlo, pero desafortunadamente, no resulta evidente para quienes no están familiarizados con el lenguaje de scripts. Explicamos la construcción de ventanas con un modelo unificado de objetos de visualización. A continuación, presentamos cómo direccionar cualquier contenido en cualquier ventana. Finalmente, mostramos varias formas alternativas de direccionamiento.
Presentamos el lenguaje de consulta XPath, en particular. La rigurosa información general se complementa con ejemplos ilustrativos y prácticos que desarrollamos al escribir scripts de pruebas unitarias para el desarrollo de JMP. También destacamos las herramientas interactivas de JMP que facilitan y facilitan el acceso al contenido de JMP, así como algunas prácticas recomendadas. ¡Permítanos mostrarle la mejor manera de obtener los resultados que desea de JMP!
Hola. Soy Mark Bailey y estoy aquí con mi colega Tanya Muldon. El título de nuestra presentación es: "Ya lo veo, ¿cómo lo consigo?". Abordaremos una situación común. JMP genera muchos resultados diferentes en distintas ventanas, y en algún momento, es posible que desee automatizar su análisis, personalizar, modificar la visualización o incluso extraer información para realizar cálculos adicionales. Esto plantea varias preguntas: ¿Cómo lo hago? ¿Existe algún mecanismo para acceder a estos resultados? ¿Existe alguna herramienta que me ayude? Finalmente, después de casi un cuarto de siglo de scripting en JMP, ¿existen buenas prácticas para este propósito?
Antes de comenzar la presentación, quiero comentar algo. Puedes pedirle a JMP que guarde un script para tu plataforma en cualquier momento. Cualquier modificación que realices en la pantalla se registra automáticamente mediante el argumento "Enviar a pantalla" en el script de inicio de la plataforma. Ejecutarás este script más adelante cuando quieras reproducir ese análisis y los resultados.
Este argumento "Enviar a pantalla" es un mecanismo que se inventó para que JMP registrara estos cambios, pero no fue diseñado para scripts. Le mostraremos las técnicas diseñadas en JMP que son, en realidad, las mejores prácticas.
En primer lugar, debe comprender que al visualizar una ventana en JMP, en realidad está viendo dos objetos que trabajan juntos. El primer objeto se denomina capa de análisis y es responsable de todos los cálculos. Se interactúa con la capa de análisis mediante los menús contextuales. Por ejemplo, al hacer clic en un triángulo, se selecciona una opción. El otro objeto se denomina capa de informe y organiza y muestra los resultados de la capa de análisis.
Quiere comunicarse con la capa de informe. Para ello, utilizamos una referencia a un objeto al que podemos enviar un mensaje. Esta capa de informe tiene una estructura de árbol ramificado, y la referencia inicial es a la raíz de este árbol de visualización. Los nodos de cada rama son cuadros de visualización JMP. Ahora, la pregunta es: ¿cómo puedo localizar o identificar el cuadro de visualización al que quiero enviar un mensaje? Para ello, utilizamos un subíndice. Este subíndice se encuentra entre corchetes después de la referencia original de la capa de informe. Si el cuadro de visualización está muy anidado, podría ser necesario usar más de un subíndice. Estos pueden ser subíndices sucesivos o un único subíndice con una lista de los diferentes cuadros.
El subíndice puede tener varias formas: absoluto, relativo o condicional. Para ilustrarlo, voy a empezar con un ejemplo muy sencillo. Aquí, abro la tabla de datos REST grande. Envío el mensaje por variante a la tabla de datos para iniciar el análisis de peso versus altura. Ahora que tengo esa referencia guardada en un objeto variable, puedo enviarle mensajes. Por ejemplo, envío el mensaje "fit line" con el número 1 para activar el análisis, y pueden ver el resultado: la línea de ajuste de mínimos cuadrados roja.
Pero me gustaría seleccionar el cuadro donde se presenta el gráfico. Necesito solicitar a la capa de análisis, mediante el mensaje de informe, una referencia a él. Lo guardo. Ahora puedo subíndice esa referencia; en este caso, el cuadro de fotograma uno es el subíndice adecuado. Ya veremos. Después, puedo enviarle el mensaje y seleccionarlo. Así es como usamos los subíndices.
Hablemos primero del subíndice absoluto. En este caso, se utiliza un índice que indica la bifurcación a seguir al recorrer la estructura ramificada de todos los cuadros de visualización. Supongamos que me interesa seleccionar esa columna de números en el resumen del esquema de ajuste. Empiezo con la raíz, la referencia que me dieron, y recorro las ramas. Desde esa raíz, recorro la segunda rama, luego la primera, y así sucesivamente. Finalmente, envío el método select.
Puedes ver que esto funciona. Los scripts absolutos son válidos y efectivos, pero son muy difíciles de especificar e igualmente difíciles de leer. Además, son "bridals". Con esto quiero decir que se rompen fácilmente dependiendo de diversas circunstancias, lo que tengas abierto, el orden en que realices ciertas operaciones y, sin duda, las actualizaciones de JMP. No lo recomendamos.
La forma relativa es más fácil de especificar y leer. En este caso, para llegar a la misma columna de números, empiezo con el informe, y luego mis subíndices son los siguientes: quiero el cuadro de esquema número 3, el cuadro de tabla número 1 y el cuadro de columna de números 1. Casi puedes imaginar lo que estás haciendo mientras lees esto. El resultado es el mismo, pero también es menos frágil.
La tercera opción es usar el lenguaje de consulta XPath. En este caso, enviamos el mensaje XPath al informe, que solo requiere un argumento: una cadena de caracteres que compone la cadena de búsqueda para obtener lo que buscamos. El resultado es el mismo que en las dos primeras opciones, pero es la menos frágil. Además, es la más potente y flexible. Devuelve una lista de todas las coincidencias y es compatible con muchas funciones y lógica condicional de este lenguaje de consulta.
Esta diapositiva muestra el inicio del archivo XML para esa ventana bivariada. Este es el lenguaje de marcado extensible. No entraremos en detalles, pero la idea es que esta es una forma de representar una ventana JMP, y el lenguaje de consulta XPath se basa en este formato.
Los árboles de visualización de JMP, cualquier ventana en JMP, se pueden expresar mediante XML. XML, en general, es una forma de etiquetar y almacenar datos y atributos jerárquicos. JMP implementa la primera versión de este lenguaje, y disponemos de un folleto independiente que profundiza en el lenguaje y proporciona otros recursos en línea.
Lo que me gustaría hacer ahora es repasar algunas de las reglas de sintaxis básicas para darles una idea, y luego le daré la palabra a Tanya para que les muestre algunos ejemplos del mundo real de cómo las usamos.
XPath también tiene una forma absoluta o ruta absoluta. Se indica con una sola barra diagonal, seguida del nombre del nodo que se busca. Los nodos sucesivos se muestran con más barras diagonales. Sin embargo, esta no suele ser la mejor manera de mostrar árboles en JMP, ya que las ventanas de JMP son dinámicas.
Una mejor manera es usar la ruta relativa. En este caso, usamos dos barras diagonales para identificar el primer nodo. Este nodo puede estar en cualquier parte del árbol de visualización, seguido de nodos adicionales para finalmente buscar el objetivo deseado. No es necesario que sean adyacentes, es decir, ramas sucesivas.
En la tercera línea, se ve un ejemplo sencillo. La cadena de búsqueda corresponde a una ruta relativa que busca un cuadro de contorno. Esto devolverá una lista de todos los nodos que se encuentran en un cuadro de contorno, lo cual es muy eficaz. Por otro lado, se podría ser más específico usando un predicado; en este caso, lo que está entre corchetes. Hablaré de esto con más detalle, pero esto nos permite especificar: no queremos todos los cuadros de contorno, sino solo los que tengan un título o resumen de ajuste.
Del mismo modo, tenemos comodines que nos permiten especificar algunos detalles de una búsqueda, pero no todos. Quiero buscar cualquier cuadro de esquema con un título que contenga la palabra resumen. El título podría ser la palabra resumen o algo como "resumen de ajuste". Encontrará todas las coincidencias. También podemos usar esto para buscar coincidencias en todos los nodos del siguiente nivel. Outlinebox/* devolverá todos los cuadros de visualización dentro de todos los cuadros de esquema.
De forma similar, no solo podemos buscar nodos, sino también atributos. En este caso, buscamos todos los atributos de todos los cuadros de contorno. La @ representa el símbolo del atributo y el asterisco indica cualquiera de ellos.
Hablemos un poco más sobre los predicados. Los predicados se indican entre corchetes. En este caso, buscamos cuadros de contorno que tengan un valor, resumen de ajuste. Pero podemos hacer más. En la segunda línea, se ve la misma búsqueda, excepto que al final no queremos todos los cuadros de columna de número, sino el último. Se puede indicar ese tipo de información; por ejemplo, en la tercera línea, queremos buscar en los tres primeros cuadros de contorno. Usamos la función de posición, y debe ser menor que el valor para que coincida con "for her". No solo puede ser algo sobre el nodo, sino también sobre un atributo de ese nodo. Podríamos buscar todos los cuadros de edición de texto con un ancho mayor que 10. Tienes esta opción a tu disposición.
Al buscar, a veces se necesita una referencia a ese cuadro de visualización para enviar un mensaje. Pero otras veces se necesita el valor o el atributo de ese nodo. Por ejemplo, buscaremos todos los cuadros de acceso y, para cada uno de ellos, todos los cuadros de edición de texto. En lugar de devolver una referencia al cuadro de visualización, buscamos el valor, el texto actual de ese cuadro, etc. En la última línea, buscamos el ancho de todos los cuadros de contorno de la ventana.
Por último, quiero hablar sobre el concepto de ejes en XPath, que es el mismo que mencioné antes en cuanto a ramificación: ir de un nodo a otro y lo que se encuentra en el camino, ya sea mirando hacia adelante, hacia atrás o hacia los lados. En el primer ejemplo, buscaré todos los cuadros de ejes y, en lugar de especificar un tipo de nodo, los dos puntos indican los padres de esos cuadros de ejes.
Lo mismo ocurre en la segunda línea: buscamos encabezados de cuadros de columnas numéricas que tengan una suma de cuadrados, y luego quiero su nodo padre. Ese es el cuadro de columnas numéricas. Puedo usar declaraciones explícitas sobre la relación. En el tercer ejemplo, busco el primer cuadro de imagen y un cuadro de edición de texto secundario.
Puedo ir al revés. Esto es similar al segundo ejemplo de esta diapositiva. Busco el encabezado de un cuadro de columna numérica de T-Ratio y luego quiero encontrar un padre de ese cuadro de visualización de tipo cuadro de columna numérica. Tienes mucha potencia y flexibilidad. A menudo, una simple cadena de búsqueda es suficiente, pero cuando es necesario, puedes usar predicados y algunas de las otras herramientas de sintaxis que mencioné.
JMP ofrece algunas funciones útiles. Si accede al menú de ayuda y busca en el índice de scripts, puede configurar este navegador para que muestre cuadros de visualización. Encontrará todos los cuadros de visualización disponibles, todos sus protocolos asociados y la posibilidad de búsqueda.
Además, si hace clic derecho en el triángulo gris frente a un cuadro de contorno, se abrirá un menú donde podrá seleccionar "Mostrar árbol de visualización" o "Mostrar propiedades". Estas herramientas interactivas le ayudan a explorar el árbol de visualización y a identificar sus valores y atributos. Esto puede ser muy útil.
Además, el registro de mejoras es una excelente manera de ver los resultados de tus búsquedas y determinar si necesitas realizar más modificaciones. Hay un mensaje JSL, "Obtener XML". A veces, necesitas consultar la representación XML subyacente. Puede ser muy útil. Además, hay una función JSL, "Obtener ruta de visualización", que indica, para un cuadro de visualización de destino, el formato de subíndice correcto o la ruta XML para referirse a ese cuadro.
Eso es todo por mi parte. Ahora le cedo la palabra a Tanya para nuestra demostración en vivo.
Gracias, Mark. En este primer caso práctico que quiero analizar, quiero usar JSL para obtener los valores encontrados en este informe. Lo primero que necesito hacer es determinar qué elemento contiene estos valores. Una forma de determinarlo es mediante "Mostrar propiedades".
Mostrar propiedades me indica que los valores medios están contenidos en un cuadro de columna numérica. Este panel muestra la estructura de árbol anidada o ramificada que Mark mencionó anteriormente. Este cuadro de columna numérica forma parte del cuadro de tabla, que a su vez forma parte de un cuadro de esquema, etc.
También encontrará este nodo de contorno de ruta de cuadro. Este es el JSL que puede usar para obtener la referencia a este cuadro de columna numérica llamado media. El modo predeterminado es el método de subíndice. También puede cambiarlo a XPath, y JMP le mostrará el código XPath para obtener una referencia a dicho cuadro de columna numérica llamado media.
Una vez que hayas determinado qué elemento almacena la información, necesitas determinar qué comandos puedes enviarle. Una forma de hacerlo es mediante el índice de scripts. Al buscar el cuadro de la columna numérica, encontrarás varios mensajes GET que podemos enviarle. El que usaré aquí es "GET" como matriz.
Voy a usar varias maneras de obtener esta información. El primer método lo enviaré a mi informe. El RPT es la capa de informe que Mark mencionó anteriormente. Dentro de mi informe, buscaré el primer cuadro de la columna numérica y obtendré esos valores como una matriz. Puedo verlos aquí abajo en mi registro. Si reviso mi informe, veo que son los mismos valores.
A continuación, usaré un comando XPath para obtener la misma información. Esta vez, buscaré el título del cuadro de esquema, "Resumen de variabilidad de las mediciones". Buscaré el cuadro de la columna numérica que contiene la media del encabezado y lo obtendré como una matriz.
Finalmente, usaré subíndices relativos. En mi informe, buscaré el resumen de variabilidad para la medición y la columna numérica llamada media, y la obtendré como una matriz.
Si bien obtengo los mismos resultados con los tres métodos, no recomendamos este primer método. No es muy robusto. Si en el futuro JMP modificara el informe y añadiera otro cuadro de columna numérica, ejecutar este código ya no me daría los resultados esperados.
Estos dos últimos ejemplos presentan cambios bastante robustos. El ejemplo relativo que mostré al final es más corto que el de XPath. Esto suele ocurrir cuando solo se extrae un elemento del informe. XPath realmente destaca cuando se extraen más de un elemento a la vez, o si se realizan tareas complejas con comodines y predicados, como las que mencionó Mark antes.
Veamos un ejemplo más complejo. En este caso práctico, queremos extraer la información de resumen de límites para ambas respuestas. Tenemos dos respuestas y queremos la información de ambas. Podemos hacerlo mediante el subíndice relativo con dos columnas.
En nuestra capa de informe, podemos buscar resúmenes de límites de peso en el primer cuadro de tabla que aparece debajo y obtener esa información. Luego, podemos usar un segundo comando para buscar resúmenes de límites de peso en el primer cuadro de tabla y obtener esa información.
Como alternativa, podemos usar un solo comando Gráfico X. En nuestra capa de informe, podemos buscar el cuadro de contorno llamado Generador de gráficos de control. Lo pueden ver aquí arriba. Podemos buscar todos los cuadros de tabla que aparecen en el Generador de gráficos de control y obtener esa información.
Al escribir ese código, vemos mucha más información en el registro de la esperada. Lo que se ve aquí son los cuadros de tabla que aparecen en el informe, así como los cuadros de tabla invisibles. Hay otros cuadros de tabla que forman parte de este informe, pero aún no hemos añadido esa información a nuestra capa de informe, como los límites añadidos o el informe Sigma. Podemos añadir información a nuestra declaración XPath para mayor visibilidad.
Para todos estos cuadros de tabla, queremos examinar tanto el cuadro de tabla en sí como sus antecesores, y queremos comprobar si son visibles o no. En este código en particular, buscamos que la visibilidad sea falsa, pero también tenemos una sentencia "not" aquí arriba. En esencia, lo que busco son los cuadros de tabla visibles en el informe. Al ejecutar esto, obtengo la misma información que obtuve anteriormente con mis dos sentencias independientes. XPath me permitió obtener esta información mediante una sola sentencia en lugar de dos.
Para este próximo caso práctico, estoy creando un generador de perfiles de predicción y he maximizado la deseabilidad. Quiero obtener los valores Y y X rojos de este informe. Dado que ambos son valores de eje y ambos son rojos, se podría pensar que están almacenados en el mismo elemento. Sin embargo, no es así.
Podemos comprobarlo volviendo a la ventana "Mostrar propiedades". Si hago clic en el elemento correcto, veremos que los valores Y son cuadros de texto y los valores X son cuadros de edición de números. Primero, trabajemos con nuestros cuadros de texto. Buscaremos el generador de perfiles de predicción mediante XPath y luego buscaremos nuestros cuadros de texto visibles. Nuevamente, tuvimos que añadir código para la visibilidad, ya que hay algunos cuadros de texto que no podemos ver en nuestro informe y no queremos que aparezcan.
Al ejecutar ese código, vemos que no solo obtenemos los valores rojos, sino también los azules para los intervalos de confianza, ya que se almacenan como cuadros de texto. Podemos agregar un bucle for para recorrer cada elemento y obtener solo los valores rojos, uno de cada tres, y almacenar esta información en una matriz.
Ahora tenemos los valores Y en rojo, pero también queremos los valores X en rojo. Estos se almacenaron en cuadros de edición numerados. Podemos usar una instrucción XPath para buscar un perfilador de predicción en los cuadros de edición numerados y queremos obtener esos valores como una matriz. Tenemos esos valores en nuestro registro aquí abajo.
Para este próximo caso práctico, quiero obtener todos los valores Y de cada línea que forma parte de este primer cuadro o gráfico de ubicación, es decir, el diámetro promedio. Al consultar "Mostrar propiedades", verá que no se puede acceder a esta capa de cuadro. Al hacer clic aquí, se muestra un cuadro, pero no se puede ver su contenido. Necesito saber cómo se almacenan estos valores en mi cuadro. Otro método para obtener esta información es usar "Mostrar estructura de árbol".
En "Mostrar Estructura de Árbol", también puedo ver la estructura de ramificación que Mark mencionó anteriormente. Dentro de este marco, veo varios segmentos. Me interesan estos segmentos de línea que aparecen aquí abajo. Puedo usar una instrucción XPath para obtener todos los segmentos de línea del primer marco.
Anteriormente, todas mis sentencias XPath tenían un nodo de cuadro de esquema. Este no. No es realmente necesario en el Generador de Gráficos de Control. Todos los gráficos del Generador de Gráficos de Control aparecen debajo de este esquema, incluso si hay varias respuestas. Por lo tanto, no lo necesito para esto; no es necesario.
Si ejecuto esto, veo que hay siete elementos. Puedo optar por usar una matriz asociativa para obtener los valores Y de estos elementos. Después de ejecutarlo, veo que mis valores Y para el promedio agregado son 4,2, mi valor Y para el límite inferior agregado es 4,1, y así sucesivamente.
Para este próximo caso práctico, tengo tres gráficos diferentes. Quiero que el eje Y de cada uno de estos gráficos tenga el mismo mínimo y máximo, y añadir la misma línea de referencia a cada uno. Primero, necesito obtener un identificador para el cuadro de ejes. Usaré XPath para buscar el nodo de contorno del grupo de ajuste. Luego, buscaré todos los cuadros de ejes visibles.
Veo que tengo seis ejes diferentes. Hay tres gráficos, uno para el eje X y otro para el eje Y, lo que suma seis. Voy a usar un bucle for para recorrer cada uno de estos valores. Solo para el eje Y, voy a establecer el mínimo en un valor, el máximo en un valor y añadir una línea de referencia. Ahora, para cada uno de mis tres gráficos, he añadido una línea de referencia y he establecido el mínimo y el máximo en el mismo valor.
Para el siguiente ejemplo, quiero acortar este Informe de Resumen de Capacidad de Sigma. Solo quiero ver lo que aparece hasta el punto de referencia. No quiero ver el CPM ni los valores esperados ni los valores observados. Puedo hacerlo mediante XPath. Enviaré un comando de cuadro de contorno a mi capa de informe. Buscaré el Informe de Resumen de Capacidad de Sigma.
Después de tener una referencia a ese nivel del informe, quiero usar XPath para seleccionar los cuadros de encabezado que empiezan con el CPM esperado, observado o igual. Después de seleccionarlos, enviaré el comando de contracción de visibilidad. Ahora veo que esos valores han desaparecido del informe. Es importante no eliminar elementos del informe, ya que esto puede tener consecuencias inesperadas. Le sugerimos que contraiga u oculte elementos del informe en lugar de eliminarlos.
Tengo un último ejemplo. Para este caso práctico, hemos colocado la plataforma "Manage Limits" en una nueva ventana y queremos eliminar el botón de ayuda. Al crear scripts JSL, a menudo se hace esto para compartir los resultados con otros. Por lo tanto, es necesario asegurarse de que el script funcione igual en su ordenador que en el de otra persona.
Windows y Macintosh suelen tener botones en ubicaciones diferentes. Nunca busque un botón basándose en su ubicación en el informe. Busque un botón por su nombre, no por su ubicación. No voy a entrar en el código del controlador de ventana, pero quiero llamar su atención sobre esta sentencia XPath. Busco el cuadro de botón "ayuda" y luego contraigo la visibilidad. Verá que el botón "ayuda" ya no está aquí abajo. De nuevo, simplemente lo pulsé. No quiero eliminarlo del informe para evitar consecuencias inesperadas.
Le he mostrado tres métodos diferentes para obtener valores del informe. El subíndice absoluto no es recomendable, ya que no es robusto a los cambios. El método XPath y el subíndice relativo son bastante robustos. Si solo obtiene un valor del informe, el subíndice relativo probablemente sea un código más corto y sencillo. El código XPath es útil cuando recopila más de un dato a la vez y si desea realizar tareas complejas como comodines y similares.
Espero que esta información te haya resultado útil y estés listo para volver a escribir algunos guiones.