Vocero | Transcripción |
| wendymurphrey | Hola y gracias por unirse a nuestra presentación de hoy. Estamos emocionados de hablar con usted sobre los escenarios comunes que enfrentan los autores de guiones en varios niveles de experiencia. |
| Nuestra intención es explicar lo que está sucediendo para que tenga las herramientas y el conocimiento para evitar estos errores. Entonces empecemos. |
| Tal vez porque no está abierto de forma predeterminada, es fácil olvidarse de revisar el registro de mensajes. Pero el registro contiene información útil sobre ejecuciones recientes de scripts. Así que echemos un vistazo más de cerca a este ejemplo en JMP. |
| Aquí podemos ver que el script simplemente abre una tabla de datos e intenta realizar una selección de fila. Cuando ejecutamos este script, |
| recibimos un mensaje de error interactivo para el error fatal, es decir, aquellas situaciones en las que su secuencia de comandos se detiene debido al error. La ventana emergente es un comportamiento nuevo para 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 |
| Busque el nombre del archivo de script para ayudarnos a llegar al área del problema. Ahora, no confíe únicamente en estas ventanas emergentes porque también aparecerán otros mensajes importantes en el registro, |
| y no necesariamente provocan una ventana emergente. Así que echemos un vistazo a 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 de inmediato que nuestro análisis no se generó. |
| Así que de nuevo, revisamos el registro |
| y vemos que había una columna que no se encontraba en la tabla de datos, pero el script continuó e imprimió nuestro mensaje en el registro. |
| Entonces, lo importante aquí es siempre revisar el registro, especialmente cuando lo que sucede no cumple con sus expectativas. Puede ser tan simple como un nombre de columna mal escrito. |
| El concepto de tabla de datos actual a menudo se describe como la tabla activa. Pero, ¿qué hace que la tabla sea la tabla de datos activa o actual y por qué es importante para su secuencia de comandos? |
| Cuando se abre, se crea o se actúa sobre una tabla, se convierte en la tabla de datos actual. Pero hay otras formas en que una tabla puede actualizarse en tiempo de ejecución que usted, como autor del script, podría no haber previsto. |
| Sus tareas que JMP procesa en segundo plano. Por ejemplo, JMP puede necesitar evaluar una fórmula o actualizar una ventana. |
| Son estos procesos en segundo plano los que pueden causar una tabla diferente a la que pretendía que se active en el tiempo de ejecución. Y esto puede hacer que su secuencia de comandos falle o, lo que es peor, ni siquiera se dé cuenta de que JMP usó la tabla incorrecta. |
| Así que aquí hemos proporcionado algunos |
| las mejores prácticas para crear sus scripts usando referencias específicas de la tabla de datos. Esta es la forma en que puede asegurarse de que se utiliza la tabla correcta, independientemente de qué tabla esté activa en tiempo de ejecución. |
| En este ejemplo, estamos demostrando cómo puede enviar una llamada bivariada a una tabla de datos específica para garantizar que los datos de esa tabla se utilicen para su análisis. |
| También puede usar la nueva columna como un mensaje a una tabla de datos específica, y esto asegurará que su nueva columna se cree en la tabla deseada y no vaya a lo que sea que esté actual. |
| También puede usar referencias de tablas de datos opcionales. Aquí, solo estamos demostrando cómo puede usar eso para hacer referencia a las columnas y vamos a hablar con más detalle sobre las columnas de referencia en un momento. |
| También puede usar referencias de tablas de datos opcionales en funciones; para cada fila y resumen hay dos donde está disponible. |
| También nos gustaría sugerirle que evite usar una tabla de datos... asignando una referencia de tabla de datos usando la función de tabla de datos actual en sus scripts de producción. En este ejemplo estamos uniendo dos tablas de datos y nos gustaría asignar una referencia a esa tabla |
| que se crea a partir de la combinación. Ahora, join devuelve una referencia a la tabla recién creada. Entonces, en lugar de asignar a la tabla de datos actual, queremos asignar la referencia cuando se crea la unión. |
| Así que aquí, simplemente hacemos nuestra asignación cuando llamamos a la combinació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 la tabla actual. |
| Ser capaz de identificar una columna usando una variable JSL es una tarea común y el método que use depende de su uso previsto. |
| La función de columna devuelve una referencia a la columna como una unidad completa. Acepta una variedad de argumentos, como que el nombre de la columna es una cadena o una variable de cadena, |
| un índice o una variable numérica que representa un índice. Se puede subíndice para hacer referencia al valor de la columna en una fila específica. |
| Algunos lugares en los que puede 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 como columna devuelve una referencia al valor en la fila actual |
| de la columna especificada. Acepta todos 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 maneje de otra manera. |
| Por lo tanto, algunos lugares excelentes para usar la función como columna son las fórmulas, para cada fila y seleccionar dónde, porque controlan la fila a medida que evalúan en cada fila por su diseño. Así que echemos un vistazo a un ejemplo de lo que queremos decir. |
| Aquí estamos abriendo una tabla de datos de muestra. Hemos asignado una variable JSL al nombre de una columna y estamos intentando usar la función de columna en nuestra selección donde. |
| Ahora, cuando ejecutamos este script, encontramos que no se seleccionaron filas. ¿Porqué es eso? Porque seleccione dónde se evalúa en cada fila, |
| el uso de la función de columna sin ningún subíndice no seleccionará ninguna fila. Y recordamos 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. |
| Entonces, las soluciones son usar la función de columna con un subíndice de fila (y este subíndice de fila simplemente significa la fila actual, sea lo que sea mientras se está evaluando la selección), o puede usar la función como columna para seleccionar sus filas. |
| El uso de una variable JSL en fórmulas puede ser problemático por varias razones. La vida útil de una variable JSL se limita a la sesión JMP actual y, a medida que cambia el valor de la variable, también puede cambiar el resultado de la fórmula. |
| Y a menos que mire la fórmula en el editor de fórmulas, es posible que no se dé cuenta de que tiene un problema. |
| Así que echemos un vistazo a nuestro ejemplo. Aquí, simplemente abro una tabla de datos y establezco una lista de columnas que me gustaría sumar. |
| Estoy creando mi nueva columna de fórmula y estoy usando mi variable JSL en mi función de suma. Así que ejecutemos esto. Y podemos ver que nuestra nueva columna fue creada y poblada con datos. Pero echemos un vistazo al editor de fórmulas. Nunca dijimos que nuestra variable JSL se usó 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. |
| Ahora recuerde que la vida útil de esa variable JSL se limitó a la sesión JMP anterior. Así que abramos la mesa y veamos lo que sucede. |
| Nos dimos cuenta de que nuestras fórmulas de columna variable... aún no se evaluaban de nuevo. Cuando echamos un vistazo a eso, todavía vemos nuestra variable JSL allí, pero ahora tenemos una línea roja debajo. Y pasamos el cursor sobre él, vemos el nombre de error sin resolver. |
| Si tratamos de volver a evaluar la fórmula, obtenemos el mensaje de error e ignorar los errores hará que todos nuestros datos cambien a faltantes. Entonces, ¿cómo arreglamos esto? |
| Cuando usa una variable en una fórmula, deberá hacer algo para indicarle a JMP que reemplace la variable con su valor antes de evaluar la fórmula. Puede usar sustituto para esto, pero hoy vamos a demostrar funciones de expresión. Así que cerremos esta tabla. |
| Abriremos una copia nueva de la tabla y restableceremos nuestra lista de columnas. |
| Y ahora echemos un vistazo a cómo solucionamos 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é envuelto en una función EXPR. |
| Y luego devolverá la expresión no evaluada. Entonces, en este código, JMP reemplazará la expresión puntajes SAT y la reemplazará con nuestra lista de columnas. |
| Entonces, ejecutemos solo esta sección y veamos qué sucede. Y vemos que la función de suma ahora tiene nuestra lista de columnas que queremos sumar en lugar de la variable. |
| Pero en realidad no creó la columna para nosotros. Simplemente devuelve esta expresión. Entonces, para evaluar eso, agregamos una función eval alrededor de nuestra función de expresión eval. |
| Y esto hará que JMP evalúe toda la nueva expresión de columna después de que se haya producido el reemplazo. Básicamente, el correo electrónico dice, ejecute... ejecute lo que devuelve la expresión eval, que es esto. |
| Entonces, ejecutémoslo y podemos ver que nuestra columna ahora se creó y tenemos los datos como esperábamos. |
| Y nuestra fórmula ya no tiene nuestra variable, tiene nuestra lista de columnas. |
| Y cuando hacemos un cambio en los datos de una columna dependiente, nuestra fórmula ahora se actualiza automáticamente. |
| Así que ahora le pasaré esto a Justin para hablar sobre algunos errores más que se deben evitar. |
| justin chilton | Muy bien, otro error que vemos que la gente comete es cuando van a establecer propiedades de columna y la sintaxis puede ser un poco complicada. Entonces, antes de entrar en detalles, |
| hablemos de lo que es una columna en términos de propiedades de columna. Entonces, esencialmente, una columna es solo un |
| repositorio para la información de esta propiedad. No realiza ninguna verificación de sintaxis para asegurarse de que |
| lo que le das es correcto y esto le permite almacenar todo lo que quieras. Y esto significa que 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. |
| Así que echemos un vistazo a un ejemplo rápido. |
| Y aquí, vamos a abrir una tabla que hemos llamado propiedades de columna, solo para probar. Tenemos una columna llamada NPN1 y una columna llamada prueba. Y esta columna tiene límites de especificación y una propiedad de acceso, pero queremos |
| agregue las propiedades de límite de especificación para probar. Así que tenemos aquí, lo que pensamos |
| es la sintaxis correcta para establecer las propiedades de la columna de límites de especificación. Ejecutamos esto y no nos da error pero cuando |
| mire la columna, hay límites de especificación en esa columna. |
| Y puedes, pero puedes decir que no es correcto. Cuando solicitamos un análisis de la capacidad del proceso con nuestros límites de especificación, |
| cuando ejecutamos eso, obtenemos uno para NPN1 y no obtenemos uno para la columna de prueba. Esto se debe a que lo que está almacenado en la propiedad de límites de especificación para la columna de prueba no es correcto. |
| Entonces, una forma de hacer esto si ya sabe cómo usar los límites de especificación de propiedades establecidas, |
| simplemente puede enviar el mensaje de propiedad a la columna NPN1, que es la columna que sabemos que es correcta. Entonces, si ejecutamos solo esa línea, obtenemos la sintaxis correcta. |
| Y esto realmente nos muestra que esto realmente debería estar en forma de lista en lugar de argumentos separados. Entonces, de otra manera, si no está familiarizado con la propiedad get, puede ir a la columna que sabe que es correcta y copiar las propiedades de la columna. |
| Y luego puede pegar eso en su secuencia de comandos y verá que ha agregado propiedades de columna, así como un par de propiedades establecidas. Por lo tanto, agregar propiedades de columna es solo una forma de agrupar varias propiedades de conjunto. Podemos eliminar eso y podemos eliminar el acceso adicional |
| propiedad. Entonces, una vez que hayamos terminado de eliminar eso, podemos usar esta propiedad establecida para enviarlo a nuestra columna de prueba con el operador de envío. Así que ahora, cuando ejecutamos esto, |
| we... it's... it ha sobrescrito nuestros límites de especificación, pero podemos confirmarlo ejecutando nuestra misma distribución usando nuestros límites de especificación. |
| Entonces, y puede ver aquí que tenemos nuestro análisis de capacidad de proceso para nuestras dos columnas. Ese es solo un ejemplo de cómo obtener límites de especificación, pero lo mismo puede aplicarse a cualquier propiedad de columna que necesite aplicar y obtener la sintaxis en JSL. |
| Entonces, el siguiente error del que vamos a hablar es manipular los comandos de despacho. Entonces, ¿qué es un comando de despacho? |
| Es lo que aparece en su secuencia de comandos guardada cuando hace clic en Guardar en la ventana de secuencia de comandos del menú del triángulo rojo o en el portapapeles. |
| Y aparece cuando agrega algo como una línea de referencia o cambia algo más como cerrar un cuadro de esquema. Y este comando fue desarrollado como una forma interna para que JMP pueda recrear gráficos |
| con la personalización que hiciste. Y no estaba previsto que los usuarios |
| personalizar esto con variables dinámicas. Eso significa que algunos de los argumentos en el comando dispatch no aceptan variables JSL. Así que echemos un vistazo a un ejemplo de dónde podría suceder eso. Así que aquí hay un guión. Tenemos una |
| tabla y una variable de cadena que usaremos un poco más adelante. Y luego, esto es esencialmente lo que devolvería la ventana Guardar en secuencia de comandos. Así que cuando ejecutamos esto, |
| podemos ver que nuestro comando de envío que establece el mínimo 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 |
| título del cuadro de esquema aquí, pero ese título del cuadro de esquema en realidad se basa en nuestra entrada y. Digamos que queríamos que esto fuera una entrada dinámica de un usuario y todo lo que tenemos es esta variable. Podríamos usar la variable para la Y. |
| Pero entonces también necesitaríamos usar ese nombre de esa columna aquí. Entonces, cuando ejecutemos esto, verá que no obtenemos la configuración correcta del eje 0.4 a 1.2, lo cual no es... eso significa que lo que enviamos no se procesó. |
| Así que hay un par de maneras de abordar esto. Y el primero será usar la solución de expresión eval de la que Wendy habló hace unos minutos. Así que aquí ves que tenemos la misma expresión eval. De hecho, queremos envolver la concatenación que probamos en el ejemplo anterior. |
| aquí. |
| Y entonces, la expresión eval dirá evaluar todo esto. Así que 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. Así que esa es una forma. |
| Pero a veces todavía puede ser un poco complicado. Y cómo deberías manipular realmente esos comandos de despacho porque todavía estás usando los comandos de despacho y tienes que saber cómo funcionan. Entonces, la forma más común de hacer esto es eliminar este comando de despacho por completo. |
| Por lo tanto, use lo que llamamos subíndices de cuadros de visualización. Así que aquí voy a ejecutar esto con el comando de envío eliminado y tenemos nuestra configuración de eje original. |
| Y luego lo que vamos a hacer es, antes de que realmente no sepamos cómo escribir esto, solo con mirarlo. Vamos a ir a este icono, este cuadro de contorno, haga clic con el botón derecho |
| editar y mostrar estructura de árbol. Entonces, esto nos muestra la estructura de árbol del cuadro de visualización dentro de este cuadro de esquema y dentro de este cuadro de esquema, puede ver que este cuadro de axix es el que queremos cambiar. Entonces, dentro de este cuadro de contorno está el cuadro de eje uno. |
| Entonces podemos ir y escribir nuestro guión. Usamos esta función de informe para obtener la capa de informe de la plataforma, OBJ1. |
| Luego subíndice para obtener el título del cuadro de esquema que sabemos que debería ser, según el nombre de nuestra columna. |
| Y dentro de eso queremos... y queremos ser lo más específicos posible, para 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 envío y simplemente convertirlos en los mensajes que enviamos al cuadro de eje. |
| Y luego pueden ver aquí que ahora la configuración de nuestros ejes es de cero a 1,4. |
| Entonces, otra forma más poderosa de hacer esto es usar XPath. Hace lo mismo, pero puede ser un poco más complicado, pero también permite una mayor flexibilidad para las cosas en versiones futuras de JMP porque puede usar datos subyacentes sobre una caja. |
| Entonces, el último error que vamos a discutir es usar solo el espacio de nombres global. Entonces |
| puede que no lo sepa, pero cuando crea un símbolo sin especificar a dónde va, entra en el espacio de nombres global. Así que esto es genial para secuencias de comandos rápidas cuando solo estás simulando algo para tu uso personal, |
| pero puede que no sea una gran idea para los guiones que envíe a sus colegas o los guiones que publique o los complementos que publique en la Comunidad. |
| Así que un poco más de detalles sobre cómo funciona el alcance y la búsqueda de nombres en JMP. Usted comienza en la parte inferior aquí en este diagrama. El ámbito local puede ser cualquier número de ámbitos, con las funciones y el cuadro local. |
| Por encima de eso, si no encuentra el símbolo o no lo especificaste para ir en local dependiendo de si estás escribiendo o leyendo, |
| luego está el alcance aquí, y existe esencialmente uno por archivo. Y hay un alcance global, que esencialmente es un alcance para su sesión de JMP. Y luego a la derecha, tenemos el alcance del espacio de nombres, que es algo que realmente tienes que buscar explícitamente para poder |
| acceso. Echemos un vistazo a un ejemplo. Esto solo va a eliminar todos mis símbolos y, dado que no especifiqué dónde deberían ir, irá a los globales. Entonces x es 5. Pero, ¿qué pasa si alguien más tiene un guión que dice, bueno, yo también |
| tener un |
| variable x que quiero usar. Y no voy a especificar dónde ponerlo. Así que voy a ponerlo en 10. |
| Pero luego, cuando regresa a su secuencia de comandos y tal vez esta sea una variable que configuró y luego tiene una devolución de llamada en un botón ... botón |
| acción que se basa en esa variable, entonces vas a usarla y la variable ha cambiado en ti y eso probablemente no es lo que deseas. |
| Entonces, ¿cuáles son algunas formas en que podemos abordar esto? Bueno, la forma más fácil de hacer esto es usar los nombres predeterminados aquí (1). Esto significa que nada terminará en el alcance global, a menos que le digas explícitamente que vaya allí. Así que echemos un vistazo |
| en esto |
| ejemplo. Entonces, todo lo que hemos hecho es agregar este nombre predeterminado aquí (1). Puede ir con... generalmente va en la parte superior de su guión, pero realmente puede ir a cualquier parte. |
| Voy, voy a limpiar mis símbolos y establecer esta variable x igual a 5. Entonces tenemos otra escritura aquí que es |
| dice que dice quiero acceder a tu, tu x. Pero realmente esta x nunca puede acceder a esta x en este espacio de nombres. Entonces |
| copiemos parte del script y hagamos que X sea igual a 50. |
| Y luego, la X en el guión de la derecha es 50, pero eso no tuvo efecto en la X en nuestro guión de la izquierda. Eso es lo que es, esa es una excelente manera de separar fácilmente sus 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 poderoso. Así que aquí estoy de nuevo... limpia mi |
| símbolos y luego creando un nuevo espacio de nombres, configurando una variable x dentro del espacio de nombres y mostrándolo. Entonces tiene un valor de cinco. |
| Y tienes otro guión aquí. Tal vez este es uno de tus guiones y lo sabes |
| myNS existe. Así que puedes intentar acceder a eso, y puedes hacerlo muy bien, porque conoces el nombre de esto. Pero es mucho menos probable que alguien nefasto cambie tu símbolo sin tu conocimiento. Entonces |
| Puedo cambiar este símbolo y seguirá siendo 10, pero si solo hago X, no tendrá ningún efecto en el resultado de la X del espacio de nombres. |
| Se lo devolveré a Wendy, quien nos contará sobre algunos recursos que se pasaron por alto. |
| wendymurphrey | Gracias Justin. Hay muchos recursos disponibles para aprender más sobre JSL, y muchos de ellos son gratuitos. Aquí hemos vinculado para usted algunos de los lugares más comunes para buscar y aprender más sobre JSL. |
| También ofrecemos soporte técnico al que puede comunicarse, y también hay un par de libros sobre el tema. Por supuesto, siempre te animamos a que eches un vistazo a nuestros recursos de formación y los planes que tienen allí para ti. |
| Asegúrese de leer el documento asociado con esta presentación sobre la comunidad JMP, ya que hay algunos errores más que cubrimos allí para usted, que no tuvimos tiempo de discutir hoy. Gracias por ver. |