Presenté muy rápidamente algunos consejos y trucos para JMP Scripting durante Club de guionistas JMP Q2 . Estos son los mismos consejos en forma de texto (y un poco más). Mis explicaciones técnicas pueden no ser correctas y podría usar términos incorrectos aquí y allá, ya que no me importa entender completamente todo (solo la mayoría) lo que sucede en JMP y JSL, solo quiero que mi código funcione bien y rápido.
Sugerencia 1 Habilite el registro incrustado del editor de secuencias de comandos JMP
Habilitar el registro incrustado le permite ver rápida y fácilmente el registro de JMP directamente en el editor de secuencias de comandos de JMP. Puede habilitar el registro integrado desde las preferencias de JMP en el editor de secuencias de comandos. JMP16 también le permite cambiar la altura del registro incrustado (yo personalmente uso valores entre 25% y 30%).

Quizás enlaces útiles
Texto Iniciar sesión en JMP (ayuda de jmp.com)
Sugerencia 2 para JMP16+ habilitar registro mejorado
Con JMP16 se lanzó una nueva función llamada Registro mejorado. Esto realiza un seguimiento de lo que ha hecho de forma interactiva en JMP y proporciona una secuencia de comandos para esas acciones y facilita que JMP escriba secuencias de comandos por usted.
El registro mejorado se puede habilitar desde las preferencias de JMP. También puede realizar modificaciones en lo que se captura y cómo se ve el registro mejorado.

Quizás enlaces útiles
Registrador de acciones y registros mejorado: nuevo en JMP 16 y JMP Pro 16
El registro mejorado en JMP 16: esto lo cambia todo
Inicio de sesión mejorado JMP (jmp.com)
Tip3 Evaluar valores de variables a expresiones
Este es un tema bastante común en JMP Community: por qué el valor de la variable no se evalúa en fórmula, por ejemplo. Básicamente, esto significa que los valores no se evaluaron "fuera" de las expresiones (variables). A continuación se muestran ejemplos para demostrar el problema y las posibles soluciones (mi método preferido es Eval(EvalExpr()) + Expr()).
Ejemplo1 Fórmula
En este ejemplo se crean dos columnas, una sin y con Eval(EvalExpr()). El que no tiene se queda con el nombre de la variable en la fórmula
Ver más...
Names Default To Here(1);
// Create demo table
dt = New Table("Demo",
Add Rows(6),
New Column("Label", Character, "Nominal", Set Values({"A", "A", "A", "B", "B", "B"})),
New Column("x", Numeric, "Continuous", Format("Best", 12), Set Values([1, 2, 3, 4, 5, 6])),
New Column("y1", Numeric, "Continuous",
Set Values(
[0.540628764079884, 0.0138843499589711, 0.363861175486818, 0.697015449637547, 0.114948588656262, 0.685370508348569]
)
),
New Column("y2", Numeric, "Continuous",
Set Values(
[0.540628764079884, 0.0138843499589711, 0.363861175486818, 0.697015449637547, 0.114948588656262, 0.685370508348569]
)
)
);
power = 3;
new_col = dt << New Column("x to " || char(power), Numeric, Continuous, Formula(:x^power));
Show(new_col << Get Formula);
power = 4;
Eval(EvalExpr(new_col = dt << New Column("x to " || char(power), Numeric, Continuous, Formula(:x^Expr(power)))));
Show(new_col << Get Formula);
Tabla de datos y fórmulas (tome nota de cómo se ven las fórmulas y qué ha pasado con los valores x a 3 (ahora están elevados a 4))

Si tuviera que guardar esta tabla de datos, volverla a abrir y agregar una nueva fila, recibiría el siguiente mensaje de error, porque la tabla de datos no sabe cuál es el valor de la potencia.

Esto se debe a que estoy usando Nombres predeterminados hasta aquí (1); en el script de ejemplo, pero el error es bueno en este caso. Si no estuviera usando Nombres predeterminados hasta aquí (1); para iniciar mi script (ver propina adicional ), agregaría la variable de potencia al espacio de nombres global y la tabla de datos aún conocería el valor de potencia en la misma sesión de JMP. Ahora podría pensar que mi tabla de datos funciona como se supone que debe hacerlo y voy a compartir la tabla y quienquiera que la haya compartido se preguntará por qué no funciona.
Ejemplo 2 Establecer límites de especificación
Este script de ejemplo demuestra cómo puede usar Eval(EvalExpr()) para obtener valores en las propiedades de la columna (en este caso, Límites de especificación).
Ver más...
Names Default To Here(1);
// Create demo table
dt = New Table("Demo",
Add Rows(6),
New Column("Label", Character, "Nominal", Set Values({"A", "A", "A", "B", "B", "B"})),
New Column("x", Numeric, "Continuous", Format("Best", 12), Set Values([1, 2, 3, 4, 5, 6])),
New Column("y1", Numeric, "Continuous",
Set Values(
[0.540628764079884, 0.0138843499589711, 0.363861175486818, 0.697015449637547, 0.114948588656262, 0.685370508348569]
)
),
New Column("y2", Numeric, "Continuous",
Set Values(
[0.540628764079884, 0.0138843499589711, 0.363861175486818, 0.697015449637547, 0.114948588656262, 0.685370508348569]
)
),
New Column("y3", Numeric, "Continuous",
Set Values(
[0.540628764079884, 0.0138843499589711, 0.363861175486818, 0.697015449637547, 0.114948588656262, 0.685370508348569]
)
)
);
Column(dt, "y1") << Set Property(
"Spec Limits",
{LSL(-1), USL(1), Show Limits(1)}
);
lower_limit = 0.5;
upper_limit = 1.5;
Column(dt, "y2") << Set Property(
"Spec Limits",
{LSL(lower_limit), USL(upper_limit), Show Limits(1)}
);
Eval(
EvalExpr(
Column(dt, "y2") << Set Property(
"Spec Limits",
{LSL(Expr(lower_limit)), USL(Expr(upper_limit)), Show Limits(1)}
);
)
);
Ejemplo3 << Al Cerrar
Como último ejemplo, demostraré cómo puede proteger su secuencia de comandos para que no sobrescriba las referencias por accidente. Brevemente hablé de esto en el 2022_Q1 MakeOverChallenge: acción al hacer clic con el mouse de varias maneras Desafío B
Si ejecuta este script y cierra la ventana bivariante, notará que la tabla Capacidad de semiconductores se está cerrando en lugar de Clase grande. Esto se debe a que cuando se cierra la ventana bivariante, dt ya hace referencia a Capacidad de semiconductores (también podría haber usado un nombre de variable diferente, por ejemplo, dt_semi)
Ver más...
Names Default To Here(1);
dt = Open("$SAMPLE_DATA/Big Class.jmp");
biv = dt << Bivariate(Y(:Weight), X(:Height), Nonpar Density);
biv << On Close(
close(dt, no save)
);
dt = Open("$SAMPLE_DATA/Semiconductor Capability.jmp");
Y si ejecuta este código, la tabla correcta se cerrará. Esto se debe a que estamos evaluando la referencia en la tabla Big Class a la sentencia << On close
Ver más...
Names Default To Here(1);
dt = Open("$SAMPLE_DATA/Big Class.jmp");
biv = dt << Bivariate(Y(:Weight), X(:Height), Nonpar Density);
Eval(EvalExpr(
biv << On Close(
Close(Expr(biv << Get Data Table), no save)
);
));
dt = Open("$SAMPLE_DATA/Semiconductor Capability.jmp");
Quizás enlaces útiles
Inserte una expresión en otra usando Eval Insert, Eval Expr, Parse y Substitute
Funciones de manejo de expresiones: Parte I - Desentrañar Expr(), NameExpr(), Eval(), ... Adivinanza
Expresiones (Ayuda de JMP, jmp.com)
Funciones de expresión (Ayuda de JMP, jmp.com)
Sugerencia adicional Inicie sus secuencias de comandos con Nombres predeterminados aquí (1);
Esto lo protegerá de la contaminación del espacio de nombres con variables globales y evitará problemas en el futuro.Esto es algo que siempre hago cuando comienzo un nuevo archivo de script, incluso si tuviera que usar un espacio de nombres personalizado. Hago esto para evitar incluso crear variables accidentales en el espacio de nombres global.
Quizás enlaces útiles
Ámbito avanzado y espacios de nombres (Ayuda de JMP, jmp.com) (Muy buena lectura, tiene varias páginas, ¡asegúrate de revisar la mayoría de ellas!)
Reglas para resolver nombres (Ayuda de JMP, jmp.com)
Scripting esencial para la eficiencia y la reproducibilidad: hacer menos para hacer más (2019-US-TUT-290)
con respecto a la
Names default to here (1);
También vi a algunas personas usar
Clear globals (1);
además al comienzo de un guión.
Siento que puedo entender por qué eso sería útil, pero ¿cuál es su opinión al respecto?
@Ressel , personalmente evitaría Clear Globals(1) ya que puede interferir con otros scripts que se estén ejecutando. Sería mucho más seguro abarcar cualquier variable de secuencia de comandos localmente o en su propio espacio de nombres.
Hola @Ressel ,
estoy de acuerdo con @DonMcCormack , es mejor no borrar las variables globales. Un ejemplo de por qué no querría hacer eso podría ser cuando tiene una funcionalidad de "Recuperación" en su secuencia de comandos, donde puede hacer clic en el botón Recuperar y luego en cualquier variable o columna que haya convertido en roles o valores. Los datos ingresados para su uso en una plataforma JMP se reemplazan automáticamente y no tiene que regresar y hacerlo manualmente. Si tiene los globales claros (1) al comienzo de su secuencia de comandos, cada vez que ejecute la secuencia de comandos, sus variables de recuperación se borrarán de la memoria, lo que hará que la función de recuperación sea inútil.
SD