| Vocero |
Transcripción |
| Wendy Murphy |
Hola y gracias por unirse a nuestra presentación de hoy. Nos entusiasma hablar con usted sobre las situaciones comunes que enfrentan los guionistas con diferentes niveles de experiencia. |
| |
Nuestra intención es explicarte qué está sucediendo para que tengas las herramientas y el conocimiento necesarios para evitar estos errores. ¡Comencemos! |
| |
Quizás porque no está abierto por defecto, es fácil olvidarse de revisar el registro en busca de mensajes. Sin embargo, el registro contiene información útil sobre ejecuciones recientes de scripts. Analicemos este ejemplo en JMP con más detalle. |
| |
Aquí podemos ver que el script simplemente abre una tabla de datos e intenta seleccionar una fila. Al ejecutar este script, |
| |
Recibimos un mensaje de error interactivo para los errores fatales, es decir, para aquellas situaciones en las que el script se detiene debido al error. La ventana emergente es una nueva función de JMP 15 y se puede desactivar en las preferencias. |
| |
Cuando descartamos ese mensaje, podemos revisar el registro y vemos el mismo mensaje desde la ventana, pero también vemos el número de línea. |
| |
Y el nombre del archivo de script para guiarnos al área problemática. No se base únicamente en estas ventanas emergentes, ya que también aparecerán otros mensajes importantes en el registro. |
| |
Y no necesariamente provocan una ventana emergente. Veamos otro ejemplo. |
| |
En este script, el autor intenta abrir una tabla, crear un análisis e imprimir un mensaje en el registro. |
| |
Y cuando ejecutamos este script, notamos inmediatamente que nuestro análisis no se generó. |
| |
Así que, de nuevo, comprobamos el registro. |
| |
y vemos que había una columna que no se encontró en la tabla de datos, pero el script continuó e imprimió nuestro mensaje en el registro. |
| |
Así que lo importante aquí es siempre revisar el registro, especialmente cuando lo que sucede no cumple con tus expectativas. Podría ser algo tan simple como un nombre de columna mal escrito. |
| |
El concepto de tabla de datos actual suele describirse como tabla activa. Pero ¿qué la convierte en tabla de datos activa o actual y por qué es importante para el script? |
| |
Cuando se abre, crea o se realiza alguna acción sobre una tabla, esta se convierte en la tabla de datos actual. Sin embargo, existen otras maneras en que una tabla puede actualizarse en tiempo de ejecución que usted, como autor del script, podría no haber previsto. |
| |
Las tareas que JMP procesa en segundo plano. Por ejemplo, JMP podría necesitar evaluar una fórmula o actualizar una ventana. |
| |
Son estos procesos en segundo plano los que pueden provocar que una tabla distinta a la que se pretendía activar en tiempo de ejecución. Esto puede provocar que el script falle o, peor aún, que ni siquiera se dé cuenta de que JMP usó la tabla incorrecta. |
| |
Así que aquí proporcionamos algunos |
| |
Prácticas recomendadas para crear scripts con referencias específicas de tablas de datos. Así se garantiza el uso de la tabla correcta, independientemente de la tabla activa en tiempo de ejecución. |
| |
En este ejemplo, demostramos cómo se puede enviar una llamada bivariada a una tabla de datos específica para garantizar que los datos de esa tabla se utilicen para el análisis. |
| |
También puede utilizar la nueva columna como un mensaje a una tabla de datos específica, y esto garantizará que su nueva columna se cree en la tabla deseada y no vaya a la que esté actual. |
| |
También puede usar referencias opcionales a tablas de datos. Aquí solo le mostramos cómo usarlas para referenciar columnas y, más adelante, profundizaremos en el tema. |
| |
También puede utilizar referencias de tablas de datos opcionales en funciones; para cada fila y resumir son dos cuando esto esté disponible. |
| |
También le sugerimos que evite usar una tabla de datos... asignándole una referencia mediante la función de tabla de datos actual en sus scripts de producción. En este ejemplo, unimos dos tablas de datos y queremos asignar una referencia a esa tabla. |
| |
Que se crea a partir de la unión. Ahora, la unión devuelve una referencia a la tabla recién creada. Por lo tanto, en lugar de asignar a la tabla de datos actual, queremos asignar la referencia al crear la unión. |
| |
Entonces, aquí simplemente hacemos nuestra asignación cuando llamamos a la unión, y cuando ejecutamos esto |
| |
Podemos ver que, de hecho, nuestra nueva variable DT hace referencia a la tabla de deseos y no se ve afectada por qué tabla es la actual. |
| |
Poder identificar una columna usando una variable JSL es una tarea común y el método que utilice dependerá del uso que pretenda darle. |
| |
La función de columna devuelve una referencia a la columna como una unidad completa. Acepta diversos argumentos, como que el nombre de la columna sea una cadena o una variable de cadena. |
| |
Un índice o una variable numérica que representa un índice. Se puede subscribir para hacer referencia al valor de la columna en una fila específica. |
| |
Algunos lugares donde puedes usar la función de columna son en llamadas de plataforma, enviando mensajes a una columna o asignando una referencia de variable a una columna. |
| |
La función de columna as devuelve una referencia al valor de la fila actual |
| |
de la columna especificada. Acepta los mismos argumentos que la función de columna, pero es importante comprender que en JMP, la fila actual siempre es cero a menos que se gestione de otra manera. |
| |
Algunos buenos lugares para usar la función "como columna" son en fórmulas, para cada fila y al seleccionar dónde, ya que, por su diseño, controlan la fila al evaluarla. Veamos un ejemplo de lo que queremos decir. |
| |
Aquí abrimos una tabla de datos de ejemplo. Asignamos una variable JSL al nombre de una columna e intentamos usar la función de columna en nuestro select where. |
| |
Ahora, al ejecutar este script, observamos que no se seleccionó ninguna fila. ¿Por qué? Porque "select where" se evalúa en cada fila. |
| |
Usar la función de columna sin subíndice no seleccionará ninguna fila. Recordemos que la función de columna devuelve una referencia a la columna como una unidad completa, por lo que una columna completa de datos nunca será igual a 14. |
| |
Por lo tanto, las soluciones son utilizar la función de columna con un subíndice de fila (y este subíndice de fila simplemente significa la fila actual, cualquiera que sea mientras se evalúa la selección donde), o puede utilizar la función de columna como para seleccionar sus filas. |
| |
El uso de una variable JSL en fórmulas puede ser problemático por varias razones. Su duración se limita a la sesión JMP actual y, a medida que cambia su valor, también cambia el resultado de la fórmula. |
| |
Y a menos que mires la fórmula en el editor de fórmulas, es posible que no te des cuenta de que tienes un problema. |
| |
Veamos nuestro ejemplo. Aquí, simplemente abro una tabla de datos y establezco una lista de columnas que quiero sumar. |
| |
Estoy creando mi nueva columna de fórmula y usando mi variable JSL en mi función de suma. Ejecutémosla. Vemos que nuestra nueva columna se creó y se rellenó con datos. Pero veamos el editor de fórmulas. Nunca dijimos que nuestra variable JSL se usara en la función de suma. |
| |
Y cuando descartamos eso y hacemos un cambio en una de las columnas dependientes, también notamos que nuestra fórmula de columna no se actualizó automáticamente. |
| |
Así que guardemos y cerremos JMP, guardemos esta tabla y cerremos JMP. |
| |
Y empezaremos de nuevo. |
| |
Recuerde que la duración de esa variable JSL se limitó a la sesión JMP anterior. Abramos la tabla y veamos qué sucede. |
| |
Observamos que nuestras fórmulas de la variable...columna aún no se han evaluado. Al revisarlo, aún vemos nuestra variable JSL, pero ahora tiene una línea roja debajo. Al pasar el cursor sobre ella, vemos el nombre "error sin resolver". |
| |
Si intentamos reevaluar la fórmula, aparece un mensaje de error. Ignorar los errores hará que todos nuestros datos se conviertan en datos faltantes. ¿Cómo solucionamos esto? |
| |
Al usar una variable en una fórmula, deberá indicarle a JMP que reemplace la variable con su valor antes de evaluar la fórmula. Puede usar "supplier" para esto, pero hoy demostraremos funciones de expresión. Cerremos esta tabla. |
| |
Abriremos una nueva copia de la tabla y restableceremos nuestra lista de columnas. |
| |
Y ahora veamos cómo podemos solucionar esto. |
| |
Entonces, la función de expresión eval le dice a JMP que evalúe y reemplace cualquier variable allí... en su argumento que esté envuelta en una función EXPR. |
| |
Luego, devolverá la expresión no evaluada. En este código, JMP reemplazará la expresión "puntuaciones SAT" con nuestra lista de columnas. |
| |
Ejecutemos solo esta sección y veamos qué sucede. Vemos que la función suma ahora contiene la lista de columnas que queremos sumar, en lugar de la variable. |
| |
Pero en realidad no creó la columna. Simplemente devolvió esta expresión. Para evaluarla, agregamos una función eval a nuestra función de expresión eval. |
| |
Esto hará que JMP evalúe toda la expresión de la nueva columna después del reemplazo. En resumen, el correo electrónico indica: «Ejecuta... ejecuta lo que devuelve la expresión eval, que es lo siguiente». |
| |
Entonces, ejecutémoslo y podremos ver que nuestra columna ahora fue creada y tenemos los datos como esperábamos. |
| |
Y nuestra fórmula ya no tiene nuestra variable, tiene nuestra lista de columnas. |
| |
Y cuando realizamos un cambio en los datos de una columna dependiente, nuestra fórmula ahora se actualiza automáticamente. |
| |
Ahora voy a pasarle la palabra a Justin para que hable sobre algunos errores más que debemos evitar. |
| Justin Chilton |
Bien, otro error que vemos que la gente comete es al configurar las propiedades de las columnas, y la sintaxis puede ser un poco complicada. Antes de entrar en detalles, |
| |
Hablemos de qué es una columna en términos de sus propiedades. En esencia, una columna es simplemente... |
| |
repositorio para esta información de propiedad. No realiza ninguna comprobación de sintaxis para asegurarse de que |
| |
Lo que le das es correcto y esto le permite almacenar cualquier cosa que desees. Esto se debe a que el consumidor de la propiedad espera que algo esté en un formato específico, ya sea una plataforma JMP, usando una propiedad de columna o incluso una aplicación JSL. |
| |
Veamos ahora un ejemplo rápido. |
| |
Aquí, abriremos una tabla llamada "Propiedades de columna", solo para pruebas. Tenemos una columna llamada NPN1 y otra llamada "prueba". Esta columna tiene límites específicos y una propiedad de acceso, pero queremos... |
| |
Agregue las propiedades de límite de especificación para probar. Así que tenemos aquí lo que creemos |
| |
es la sintaxis correcta para establecer las propiedades de la columna de límites de especificación. Ejecutamos esto y no nos da ningún error, pero cuando... |
| |
Mira la columna, hay límites de especificaciones en esa columna. |
| |
Y puedes, pero te das cuenta de que no es correcto. Cuando solicitamos un análisis de la capacidad del proceso con nuestros límites de especificación, |
| |
Al ejecutarlo, obtenemos uno para NPN1, pero no para la columna de prueba. Esto se debe a que la información almacenada en la propiedad de límites de especificación de la columna de prueba es incorrecta. |
| |
Entonces, una forma de hacer esto si ya sabe cómo usar los límites de especificación de propiedades establecidas, |
| |
Puedes simplemente enviar el mensaje de propiedad a la columna NPN1, que es la columna que sabemos que es correcta. Así que, si ejecutamos solo esa línea, obtenemos la sintaxis correcta. |
| |
Esto nos muestra que debería estar en formato de lista, no con argumentos separados. Si no conoce la propiedad get, puede ir a la columna correcta y copiar sus propiedades. |
| |
Luego, puedes pegarlo en tu script y verás que has añadido propiedades de columna, así como un par de propiedades de conjunto. Añadir propiedades de columna es simplemente una forma de agrupar varias propiedades de conjunto. Podemos eliminar eso y el acceso adicional. |
| |
Propiedad. Una vez que la eliminemos, podemos usar esta propiedad para enviarla a nuestra columna de prueba con el operador de envío. Ahora, al ejecutar esto, |
| |
nosotros...es...ha sobrescrito nuestros límites de especificaciones, pero podemos confirmarlo ejecutando nuestra misma distribución usando nuestros límites de especificaciones. |
| |
Aquí pueden ver que tenemos nuestro análisis de capacidad de proceso para ambas columnas. Este es solo un ejemplo de cómo obtener límites de especificación, pero lo mismo aplica a cualquier propiedad de columna que necesite aplicar y obtener la sintaxis en JSL. |
| |
El siguiente error del que hablaremos es la manipulación de comandos de despacho. ¿Qué es un comando de despacho? |
| |
Es lo que aparece en el script guardado cuando haces clic en la ventana Guardar en script o Guardar en el portapapeles del menú de triángulo rojo. |
| |
Aparece al agregar algo como una línea de referencia o al cambiar algo, como cerrar un cuadro de contorno. Este comando se desarrolló internamente para que JMP pudiera recrear gráficos. |
| |
con la personalización que hiciste. Y no estaba previsto que los usuarios... |
| |
Personaliza esto con variables dinámicas. Esto significa que algunos argumentos del comando de envío no aceptan variables JSL. Veamos un ejemplo de dónde podría ocurrir esto. Aquí tienes un script. Tenemos un |
| |
Tabla y una variable de cadena que usaremos más adelante. Esto es básicamente lo que devolvería la ventana de guardar en script. Al ejecutar esto, |
| |
Podemos ver que nuestro comando de despacho establece el mínimo y el máximo y el incremento para el eje de medición. |
| |
Aquí se establece de cero a 1,4. Ahora podemos ver que el comando de despacho se basa en el |
| |
Aquí está el título del cuadro de esquema, pero este se basa en nuestra entrada "y". Supongamos que queremos que sea una entrada dinámica de un usuario y que tenemos esta variable. Podríamos usar la variable para la "Y". |
| |
Pero también necesitaríamos usar el nombre de esa columna aquí. Al ejecutar esto, verán que no obtenemos la configuración correcta del eje (0,4 a 1,2), lo cual significa que lo que enviamos no se procesó. |
| |
Hay un par de maneras de abordar esto. La primera es usar la solución de expresión eval que Wendy mencionó hace unos minutos. Aquí ven que tenemos la misma expresión eval. De hecho, queremos encapsular la concatenación que probamos en el ejemplo anterior. |
| |
aquí. |
| |
Y entonces la expresión eval indicará que se debe evaluar todo esto. Entonces, cuando ejecutamos eval EXPR, |
| |
simplemente reemplaza todo eso con nuestra cadena concatenada y luego, recuerda cuando hacemos la evaluación, |
| |
Ejecuta esa expresión. Así que aquí tenemos de 0 a 1,4. Esa es una forma. |
| |
Pero a veces puede ser un poco complicado. ¿Y cómo deberías manipular esos comandos de despacho, ya que todavía los estás usando y necesitas saber cómo funcionan? La forma más común de hacerlo es eliminar este comando de despacho por completo. |
| |
Entonces, usamos lo que llamamos subíndice de cuadro de visualización. Aquí ejecutaré esto con el comando de despacho eliminado y tendremos la configuración original del eje. |
| |
Y luego, lo que haremos es, antes de que no sepamos cómo escribir esto, solo con verlo. Así que iremos a este ícono, este cuadro de contorno, y haremos clic derecho. |
| |
Editar y mostrar la estructura de árbol. Esto nos muestra la estructura de árbol del cuadro de visualización dentro de este cuadro de contorno. Dentro de este cuadro de contorno, pueden ver que este cuadro de eje es el que queremos cambiar. Dentro de este cuadro de contorno está el cuadro de eje uno. |
| |
Entonces podemos escribir nuestro script. Usamos esta función de informe para obtener la capa de informe de la plataforma, OBJ1. |
| |
Luego, suscribimos el índice para obtener el título del cuadro de esquema que sabemos que debería tener, en función del nombre de nuestra columna. |
| |
Y luego, dentro de eso queremos... y queremos ser lo más específicos posible, de modo que si las cosas cambian en una versión futura de JMP, sea menos probable que tengamos problemas. |
| |
Entonces, dentro de eso, queremos el cuadro de eje 1 y así es como obtenemos ese cuadro de eje, y luego podemos tomar la misma información del comando de despacho y simplemente convertirlos en los mensajes que enviamos al cuadro de eje. |
| |
Y luego puedes ver aquí que ahora nuestra configuración de eje es de cero a 1,4. |
| |
Otra forma más potente de hacerlo es usar XPath. Hace lo mismo, pero puede ser un poco más complejo, pero también ofrece mayor flexibilidad para futuras versiones de JMP, ya que permite usar datos subyacentes de una caja. |
| |
El último error que vamos a comentar es usar solo el espacio de nombres global. |
| |
Puede que no lo sepas, pero al crear un símbolo sin especificar su ubicación, este se incluye en el espacio de nombres global. Esto es ideal para scripts rápidos cuando simplemente estás creando una maqueta para uso personal. |
| |
pero puede que no sea una gran idea para los scripts que envías a colegas o los scripts que publicas o los complementos que publicas en la Comunidad. |
| |
Aquí hay algunos detalles más sobre cómo funcionan el alcance y la búsqueda de nombres en JMP. Empieza en la parte inferior de este diagrama. El alcance local puede ser cualquier número de alcances, incluyendo funciones y un cuadro local. |
| |
Entonces, encima de eso, si no encuentra el símbolo o no lo especificaste para que vaya localmente dependiendo de si estás escribiendo o leyendo, |
| |
Luego está el ámbito aquí, que existe esencialmente uno por archivo. Y está el ámbito global, que esencialmente es un ámbito para su sesión de JMP. Y luego, a la derecha, tenemos el ámbito del espacio de nombres, que es algo que realmente debe buscar explícitamente para... |
| |
Acceso. Veamos un ejemplo. Esto simplemente eliminará todos mis símbolos y, como no especifiqué dónde deberían ir, se guardarán en las variables globales. Entonces, x es 5. Pero ¿qué pasa si alguien tiene un script que dice, bueno, yo también...? |
| |
tener una |
| |
La variable x que quiero usar. No voy a especificar dónde colocarla. Así que la estableceré en 10. |
| |
Pero luego, cuando regresas a tu script y tal vez esta es alguna variable que has configurado y luego tienes alguna devolución de llamada en un botón... botón |
| |
acción que depende de esa variable, luego vas a usarla y la variable ha cambiado y eso probablemente no sea deseado. |
| |
¿Cómo podemos solucionar esto? La forma más sencilla es usar nombres predeterminados aquí(1). Esto significa que nada llegará al ámbito global, a menos que se le indique explícitamente que vaya allí. Veamos. |
| |
En este |
| |
Ejemplo. Solo hemos añadido el nombre "predeterminado" aquí (1). Puede ir con... generalmente va al principio del script, pero puede ir donde sea. |
| |
Voy a limpiar mis símbolos y establecer esta variable x igual a 5. Entonces tenemos otra escritura aquí que es |
| |
Dice que quiero acceder a tu x. Pero en realidad, esta x nunca podrá acceder a esta x en este espacio de nombres. Entonces... |
| |
Copiemos parte del script y hagamos X igual a 50. |
| |
La X en el script de la derecha es 50, pero eso no afectó a la X en el script de la izquierda. Así que es una excelente manera de separar fácilmente los símbolos de otros scripts y aplicaciones. |
| |
La otra opción es usar un espacio de nombres personalizado. Esto es un poco más avanzado, pero puede ser muy potente. Así que aquí estoy de nuevo... limpiando mi... |
| |
símbolos y luego crear un nuevo espacio de nombres, configurar una variable x dentro del espacio de nombres y mostrarla. Por lo tanto, tiene un valor de cinco. |
| |
Y tienes otro guion aquí. Quizás este sea uno de tus guiones y lo sabes. |
| |
myNS existe. Puedes intentar acceder a él, y lo harás sin problemas, porque conoces su nombre. Pero es mucho menos probable que alguien malintencionado cambie tu símbolo sin tu conocimiento. |
| |
Puedo cambiar este símbolo y seguirá siendo 10, pero si solo hago X, realmente no tendrá ningún efecto en el resultado de la X del espacio de nombres. |
| |
Voy a devolvérselo a Wendy, quien nos contará algunos recursos que se pasan por alto. |
| Wendy Murphy |
Gracias, Justin. Hay muchos recursos disponibles para aprender más sobre JSL, y muchos son gratuitos. Aquí te dejamos enlaces a algunos de los sitios más comunes para que consultes y aprendas más sobre JSL. |
| |
También ofrecemos soporte técnico al que puede contactar, y disponemos de un par de libros sobre el tema. Por supuesto, le recomendamos consultar nuestros recursos de capacitación y los planes que tenemos disponibles para usted. |
| |
No olviden consultar el artículo asociado con esta presentación sobre la comunidad JMP, ya que allí corregimos algunos errores más que no tuvimos tiempo de comentar hoy. Gracias por su atención. |