Parte del script no se ejecuta a menos que se ejecute después del hechoTengo una parte del script que estoy usando para recodificar columnas en mi tabla para cambiar los valores de "X" a 0. Conseguí que esta parte del código funcionara (¡¡Gracias a los foros de discusión de JMP!!) cuando se ejecuta por separado de mi script principal. Sin embargo, cuando inserto esto en un script más grande (incluso cuando está al final), JMP no ejecuta mi comando. Cuando el código se colocó en medio de mi secuencia de comandos, todo lo posterior no se ejecutó... así que lo moví al final de mi secuencia de comandos principal pero todavía no se ejecuta. Cada vez que resalto esta parte y la ejecuto después, hace exactamente lo que quiero.
Intenté implementar wait(0);, cambiar de i a k y usar una declaración Try también en For Each Row, pero no tuve suerte. Realmente me estoy rascando la cabeza sobre por qué solo funcionaría después del hecho. ¿Sugerencias?
//Recode columns in Yield Table to give "0" instead of X's
wait(0);
yieldcols = Yields << get column names;
For Each Row( For( k = 1, k <= N Items( yieldcols ), k++,
If( Is Missing( As Column( yieldcols[k] )[] ),
As Column( yieldcols[k] )[] = 0 ) ) );
Modelado estadístico avanzadoAutomatización y secuencias de comandosCombinación y limpieza de datosDiseño de experimentosLa personalización en masaRe: Parte del script no se ejecuta a menos que se ejecute después del hechoHola,
No estoy seguro de por qué el código que proporcioné no funciona. Podrías intentar lo siguiente:
1) Ejecute el código original que proporcioné, solo, en una nueva ventana. ¿Funciona? Si no, ¿qué versión de JMP estás usando? La indexación directa de tablas de datos se agregó hace algunas versiones, pero no está en JMP 12, por ejemplo.
2) Suponiendo que 1) anterior funcione, el siguiente paso es reemplazar todas las instancias de "dt" con "yields", ejecutar el nuevo código solo en la nueva ventana. Esto funcionó para mí y espero que funcione para usted si 1) funcionó para usted.
Names Default To Here(1);
//create a table with roughly 10% missingness
yields = astable(J(1e5,5,randominteger(1, 20)/(randomuniform() > 0.1)));
For( i = 1, i <= N Col( yields ), i++,
yields[Loc( Is Missing( yields[0, i] ) ), i] = 0
);
3) Si los datos de su tabla se basan en fórmulas, es posible que las fórmulas se hayan "escrito" en la columna, pero es posible que no hayan terminado de evaluarse cuando el JSL destinado a corregir los errores comience a ejecutarse. Asegúrese de que todas las fórmulas estén completamente actualizadas, antes de que se ejecute el código, precediendo el código con esta línea:
Yields << run formulas;
4) Asegúrese de que "Rendimientos" no haga referencia a nada más que a la tabla de datos de interés... ni a un nombre de columna, a otro nombre de variable, a una variable de tabla, etc. Por este motivo, como práctica recomendada, recomiendo utilizar "dt" en algún lugar de cualquier nombre de variable utilizado para apuntar a una tabla; Si bien es fácil imaginar la sobrescritura de un identificador de tabla "Rendimientos" al nombrar inadvertidamente una matriz o vector de valores "Rendimientos", es mucho menos probable nombrar accidentalmente dicha matriz o vector "RendimientoDt". Sin embargo, dado que su programa funciona si pausa la ejecución, no creo que ese sea el problema.
Si 1) y 2) funcionan para usted y ni 3) ni 4) solucionan el problema, necesitaré más información para ayudarlo: una tabla de muestra desinfectada y un fragmento de código que se puede ejecutar en esa tabla para mostrar que el El reemplazo no funciona en esa mesa.
Salud,
Brady
Re: Parte del script no se ejecuta a menos que se ejecute después del hechoHola, Mark. Esto se ejecuta por separado ahora pero no funciona como una parte más pequeña de mi script más grande. Me pregunto si esto no es tanto un problema de secuencias de comandos, sino más bien otro problema. ¿Por qué una sección de código funcionaría cuando se ejecuta sola y fallaría cuando se ejecuta como una parte más pequeña de un script más grande (incluso cuando se ejecuta en último lugar, como sería en el primer escenario)?Re: Parte del script no se ejecuta a menos que se ejecute después del hechoHola Brady,
Agradezco todos los consejos y ayuda. Sin embargo, esta sección de código que usted proporcionó no parece funcionar para mí (después de cambiar el nombre de la tabla). Lo encuentro muy extraño: no veo ninguna razón por la que no funcione. ¿Algunas ideas?
For( i = 1, i <= N Col( Yields ), i++,
Yields[Loc( Is Missing( Yields[0, i] ) ), i] = 0
);
Para reformular un poco mi pregunta: El código que tengo actualmente funciona cuando se ejecuta por separado, pero no cuando se ejecuta como una pequeña sección de un código más grande. . Eso me parece extraño en sí mismo. Estoy de acuerdo con cambiar mi código, es solo que para mí ese no parece ser el problema, porque (aunque no es "perfecto") ¡funciona! ¿Podría ser esto un error? ¿O hay formas de solucionar este problema? Tampoco tengo errores al depurar.
Re: Parte del script no se ejecuta a menos que se ejecute después del hechoAdemás, si tiene muchas filas o columnas, vincule nrows (dt) o ncols (dt) a una variable y utilícela como índice superior, de modo que no sea necesario evaluar nrow(dt) o ncol(dt) en cada iteración.
//do some stuff
);nc = ncol (dt);
for (i = 1, i<=nc, i++,
JMP 16 le permite hacer esto con un bucle for each( ), que no debe confundirse con for each row( ). For Each( ) tiene otras ventajas sobre los bucles for() básicos, como el alcance local de las variables y una ejecución más rápida en algunos casos. Si está utilizando JMP 16, asegúrese de comprobarlo.
for each ( { i }, 1::nrow( dt ),
//do some stuff
);
Re: Parte del script no se ejecuta a menos que se ejecute después del hechoAdemás, permítanme ser el primero en admitir que nunca uso For Each Row().
Alguna vez.
Ni siquiera si los niños comen gratis.
Si debo recorrer filas (lo cual trato de evitar, tomando todos los valores de una columna a la vez, ya sea indexando directamente como lo hacemos en este ejemplo, usando << obtener valores y operando la lista o matriz resultante, etc.) , Escribo un bucle for () adecuado.
No estoy diciendo que For Each Row ( ) nunca funcione. Estoy diciendo que viene con salvedades, y no sé cuáles son esas salvedades. Por lo tanto, evito For Each Row ( ) como la plaga y recomiendo que otros hagan lo mismo, a menos que ambos 1) estén dispuestos a aprender las advertencias y 2) estén dispuestos a asumir que aquellos que editan, mantienen o interactúan de otro modo con el código en el futuro hará lo mismo.
Esto último es tan improbable que nunca pensé en emprender lo primero.
Salud,
Brady
for (i =1, i<=nrow(dt), i++,
//do some stuff
);
Re: Parte del script no se ejecuta a menos que se ejecute después del hechoHola,
Si le preocupa el rendimiento en tablas grandes, puede intentar lo siguiente (tenga en cuenta que utilicé dt como nombre de la tabla). En una tabla moderada (100.000 filas x 5 columnas), la diferencia de rendimiento es notable en mi máquina, 0,0056 segundos frente a 0,8261 segundos. Esto se debe a un par de razones:
Primero, las funciones Loc ( ) y Is Missing ( ) son rápidas, incluso cuando se usan en una columna completa a la vez, que es lo que estamos haciendo aquí. Es decir, dt[0, i] recupera la columna i completa.
Además, al indexar directamente las columnas, no tenemos que ocuparnos de obtener sus nombres ni de recuperarlos de la lista que los contiene.
Salud,
Brady
Names Default To Here(1);
//create a table with roughly 10% missingness
dt = astable(J(1e5,5,randominteger(1, 20)/(randomuniform() > 0.1)));
For( i = 1, i <= N Col( dt ), i++,
dt[Loc( Is Missing( dt[0, i] ) ), i] = 0
);
Re: Parte del script no se ejecuta a menos que se ejecute después del hecho//Recode columns in Yield Table to give "0" instead of X's
yieldcols = Yields << get column names;
For( col = 1, col <= N Items( yieldcols ), col++,
For Each Row( If( Is Missing( As Column( yieldcols[col] )[] ), As Column( yieldcols[col] )[] = 0 ) )
);
Re: Parte del script no se ejecuta a menos que se ejecute después del hechoSimplemente inténtalo. Esto no funciona, incluso cuando se ejecuta por separado. El script original que tengo funciona, pero solo cuando se ejecuta por separado (después del hecho, después de ejecutar todo el script y presionar Ctrl+R en esa sección).Re: Parte del script no se ejecuta a menos que se ejecute después del hecho//Recode columns in Yield Table to give "0" instead of X's
yieldcols = Yields << get column names;
For( col = 1, col <= N Items( yieldcols ), col++,
For Each Row( If( Is Missing( As Column( yieldcols[k] )[] ), As Column( yieldcols[k] )[] = 0 ) )
);