Necesito un bucle JSL que busque los encabezados de columna de una tabla de datos, y si el encabezado de columna tiene "(rad)", me gustaría multiplicar todos los valores de esa columna por 180/pi y luego cambiar "(rad)" a "(deg)" en el encabezado de columna.
He probado todo lo que se me ocurrió, incluido chatGPT, pero hasta ahora no he tenido suerte.
- Obtenga todas las columnas usando << Obtener nombres de columnas
- Establecer la tabla para que no se actualice usando << iniciar actualización de datos
- Recorrerlos en bucle utilizando For Each
- Comprueba si su nombre tiene (rad) usando Contiene / Comienza con / Termina con
- Utilice For Each Row para recorrerla y cambiar los valores a grados.
- Esperaría que hubiera un mejor método para esto, pero no estoy seguro de que realmente lo haya, a menos que desee crear nuevas columnas y eliminar las antiguas, ya que no deberíamos usar << establecer cada valor, lo que hace que sea extremadamente fácil de hacer y leer.
- Aplicar la fórmula en su lugar (agregada en JMP18) podría funcionar, pero es difícil entender cómo usarla.
- Usar valores de matriz es una buena opción, pero For Each Row siempre funcionará, siempre es una buena idea aprenderlo.
- Utilice sustituir y << Establecer nombre para cambiar el nombre de la columna
- Deje que la tabla se actualice nuevamente usando << fin de actualización de datos
Names Default To Here(1);
dt = New Table("Untitled",
Add Rows(2),
Compress File When Saved(1),
New Column("Column 1", Numeric, "Continuous", Format("Best", 12), Set Values([., .])),
New Column("a (rad)", Numeric, "Continuous", Format("Best", 12), Set Values([1, .]))
);
colnames = dt << Get Column Names(Continuos, "String");
dt << Begin Data Update();
For Each({colname}, colnames,
If(Contains(colname, "(rad)"),
For Each Row(dt, Column(dt, colname)[] = Column(dt, colname)[] * 180 / Pi());
Column(dt, colname) << Set Name(Substitute(colname, "(rad)", "(deg)"));
)
);
dt << End Data Update();
Write();
¡Siempre impresionante, gracias!
Algunas preguntas adicionales:
- ¿Por qué "colname" está entre llaves como primer argumento del bucle for each?
- Estaba intentando hacer algo como "dt:colname[rowIdx] = dt:colname[rowIdx] * 180/Pi()" -- ¿cómo interpretaría JMP esta línea y por qué está mal?
- ¿Qué hace el "[]" al final de "Column(dt,colname)[]"? ¿Hay alguna sección en la documentación que trate este tema?
¡Gracias de nuevo!