Mencioné algunos temas posibles en uno de mis correos electrónicos, pero aquí hay algunas ideas:
- Usando referencias
- dt = Abrir()... y así sucesivamente en lugar de Tabla de datos actuales()
- Encontrar referencias a informes/en la capa de informes de manera sólida
- Gestión de espacios de nombres/ámbitos
- Inicializando variables
- Encontrar estilo de programación
- escribir globales en MAYÚSCULAS
- Utilizando expresiones
- Trata de atraparlo
- Inicio sesión
- Mostrar, escribir, imprimir, registrador personalizado
- Utilizando pila
- Variables en botones/ventanas
- Especialmente al regresar de la función.
- Cuadro de contexto(), ventana:
- Botón - Caminos
- Guiones de embalaje
- En lugar de tener un script masivo creado por JMP, separe las partes en scripts más sólidos.
- Mejores prácticas
- Evite borrar/eliminar símbolos/globales
- No deje los scripts de Borrar inicio de sesión
- Bloqueo de variables/espacios de nombres
- Caminos
- Convertir ruta de archivo
- Directorio predeterminado
- $PATH_VARIABLES
- Columnas de referencia
- Column(dt, "colname") vs dt:colname vs:colname, vs dt:"colname"n (y AsColumn) y así sucesivamente...
- Matemáticas de punto flotante
- Mire antes de saltar vs. Es más fácil pedir perdón que permiso al escribir código
- Valores faltantes/vacíos
- Está vacío(), Falta(), Si, IfMZ, N elementos() > 0
- Comprobando tablas abiertas, informes abiertos, ventanas personalizadas ya abiertas,...
- << Traer ventana al frente
- Lanzar() en .jsl vs jmpaddin
- Función de ventana modal personalizada
- Mejorar (y utilizar) los scripts creados por JMP
- Agregar referencias/variables
- Acortar los scripts creados por JMP
- Evitar el envío
- Cómo las preferencias del usuario pueden afectarlos (generalmente causando problemas muy grandes)
- Comprender y utilizar estructuras de datos.
- Por ejemplo, no es necesario almacenar todo en diferentes nombres de variables (especialmente cuando se usa Eval Parse)
- Usar listas/matrices asociativas
- Si se habla de UI, ¿podrían hacer referencias cuando sean necesarias?
Publicaciones parcialmente relacionadas (pueden verse extremadamente desordenadas debido a las "nuevas" páginas de la comunidad JMP)
GRACIAS, aquí puedo compartir algunos de los míos, pero la mayor parte de lo que hago ya se mencionó anteriormente:
- Pruebe (cerrar (dt_ref, nosave)); dt_ref = Open(...) --> limpia una tabla y no produce un error cuando el script se ejecuta por primera vez. El problema es que puede cambiar el nombre de la tabla pero JSL aún la cerrará ya que la referencia dt también cambia.
- Utilice la pestaña siempre para identificar bucles y funciones más grandes para no perderse en el código y buscar un faltante);
- Considere cambiar el nombre de las columnas después de un paso de tabulación si ve la posibilidad de uso en varios idiomas. Esto puede romper el código de otros usuarios, pero el tuyo funciona bien.
- Try to dynamically work with reference in platform to avoid user inputs.
You could do this:
dt << Process screening(Process Variables({:Column 4, :Column 6, :Column 7}));
But you can also use this:
dt = current data table();
col_names = dt << get column names();
spec_list = {};
for(k=1,k<=nitems(col_names),k++,
if(!isempty(column(dt,k) << Get Property("Speclimits")),insertinto(spec_list,col_names[k]);););
dt << Process screening(Process Variables(eval(spec_list)));
altering a column name will then not break the code and the question about missing spec limits will not be triggered. -
Lo más probable es que elija algo como lo adjunto (definitivamente no tendré suficiente tiempo para revisarlos todos, pero eso no debería ser un problema). Es posible que haya terminado con algo como "consejos para JSL", pero me llevó bastante tiempo incluso crearlo.
Gracias Jarmo, algunas reflexiones sobre el guión:
línea 103: uso esto solo cuando el bucle es muy corto y solo hay una línea para ejecutar. Esto mantiene el código un poco más ordenado.
línea 109: con nombres cortos puede encontrarse con el problema de anular una función JMP con una variable como media = (x1 + x2) / 2; es mejor escribir m_production_speed o media_producción_velocidad.
línea 149: Hice que el comentario if fuera un bucle if justo después de la coma para el plegado de código:
Si escribes el código así:
if(1,//average of x
mean_x = mean(x);
);
y doblas el código, se verá así:

Me ahorra una línea encima del bucle for o la declaración if.
linea 198: " Inicialicemos la matriz, ya que si se crea con antelación, llenarla será más rápido". eso me llevó 1 minuto con copilot, no me imagino depurar un código con 200 comentarios *g*.
Línea 212: Mencionaría que puedes usar el registro y el flujo de trabajo como referencia y luego modificar el código según tu estilo de programación. Este es especialmente el caso cuando le pido a un usuario que no sabe programar que haga un flujo de trabajo de lo que quiere lograr con el script que debo programar para él. De esta manera, tengo una buena comprensión de lo que quiere y ya tengo la mayor parte de la función codificada.
línea 391: Esto puede acelerar el script cuando itera a través de una tabla mientras tiene abierto un generador de gráficos para que no actualice el gráfico con cada cambio.
Names Default To Here( 1 );
try(close(dt,nosave));
dt = new table("test");
dt << New Column( "Y",
Numeric,
"Continuous",
Format( "Best", 12 ),
<<SET initial="" data="https://community.jmp.com/"></SET><SPAN>línea 414: Además de esto, agregaría: siempre agregue una referencia de tabla cuando proporcione un nombre fijo al usar funciones como << Subset y demás. Esto es muy útil cuando el nombre generador ya existe y JMP agrega automáticamente el "2" al final. Sin una referencia, puede trabajar accidentalmente en la tabla incorrecta.</SPAN>
<SPAN>Línea 74: esto es algo que robaré para mis scripts.</SPAN>:)</img>
<SPAN>línea 757: esto también puede en ocasiones hacer que los bucles se vuelvan muy lentos, pero es útil cuando se trabaja con sentencias SQL, ya que enviar una solicitud puede adelantar al resto del script y causar un error porque puede llevar algún tiempo obtener los datos, pero funciona bien cuando se ejecuta el código línea por línea.</SPAN>
line 780: maybe referencing to the JSL cook book? <A href="https://community.jmp.com/t5/JSL-Cookbook/tkb-p/jmp-scripting" target="_blank">Libro de recetas de JSL - Comunidad de usuarios de JMP</A>
line 787: Just be aware that this will also break when a report reference name contains a variable.
This is what happened here: <A href="https://community.jmp.com/t5/Discussions/fitting-truncated-data-to-a-continuous-distribution/m-p/772495#M95287" target="_blank">Re: Ajuste de datos truncados a una distribución continua - Comunidad de usuarios de JMP</A>
the detection limits is added with censored data in the title and can change depending on the data set.
THX a lot for the script.<BR /><BR />Regards<BR /> Mauro
línea 787
Esta es exactamente la razón por la que casi siempre uso XPath con el atributo helpKey si está disponible (no me importa el título del cuadro de esquema). Hay tantas formas de (intentar) crear referencias sólidas que podría dedicar unos 20 minutos a dar ejemplos al respecto.
Por ejemplo, con los límites de detección, utilizaría la tecla de ayuda o comodines (si supiera que el nombre del cuadro de contorno puede cambiar...)
Names Default To Here(1);
dt = open("$SAMPLE_DATA/Big Class.jmp");
Column(dt, "height") << Set Property("Detection Limits", {60, 100});
dist = dt << Distribution(
Stack(1),
Continuous Distribution(
Column(:height),
Horizontal Layout(1),
Vertical(0),
Process Capability(0),
Fit Normal
)
);
obs = Report(dist) << XPath("//OutlineBox[@helpKey='FitDistributions']");
show(obs << get title);
// Or
ob = Report(dist)[OutlineBox("Fitted Normal Distribution?")];
show(ob << get title);
// Or
obs2 = Report(dist) << XPath("//OutlineBox[contains(text(), 'Fitted Normal Distribution')]");
show(ob << get title);
</CODE></P>
<P>I also added few things based on your comments. Thanks!<CODE class=" language-jsl">