Tengo una fórmula que es recurrente.JMP puede resolverlo, pero advierte sobre los ciclos cada vez que creo una nueva fórmula.
Cómo puedo:
- ¿Forzar una nueva iteración?
- ¿Configurar el número de iteraciones (o criterios de detención) para resolver la recurrencia?
- ¿Evitar que la evaluación vuelva a ocurrir? Suprimir la opción Eval en el menú de fórmulas, no funcionó.
La función es un poco más compleja pero no diferente a la siguiente, que funciona sin problemas.
X (k + 1) = 0,99 * X (k)
If(
Selected() == 1, 1,
Row() == 1, 1,
Lag( :X ) * 0.99
)
El evaluador de fórmulas de JMP funciona evaluando primero las columnas de fórmula que solo dependen de columnas que no son de fórmula, luego evalúa las columnas de fórmula que dependen de columnas de fórmula que ya están evaluadas. Si la fórmula de la columna A depende de la columna B y la fórmula de la columna B depende de la columna A, JMP no puede elegir cuál evaluar primero. Si logra engañar a JMP para que cree una dependencia circular, no puede estar seguro de qué columna estaba usando datos antiguos de la otra columna.
JMP evalúa una columna de arriba a abajo. Dentro de una fórmula, puede usar la función de retraso (o sub-secuencias de comandos) para ver las filas anteriores y obtener el valor calculado previamente. No estoy seguro de qué sucede si observa las filas futuras, pero ese valor aún no se ha calculado.
Hay fórmulas que podría pensar que podrían funcionar según las reglas de Excel, pero JMP no es una hoja de cálculo y juega según las reglas anteriores. Si necesita hacer que la columna A se refiera a un retraso de la columna B y la columna B se refiera a un retraso de la columna A, debe hacer que A y B sean columnas sin fórmula y escribir JSL para completarlas. Agregue ese JSL a una secuencia de comandos de tabla con un nombre como "Ejecutarme cuando sea necesario actualizar los datos".
Si tiene una función recursiva, puede crear una función JSL que se llame a sí misma. JSL tiene un límite bastante bajo en la profundidad de recursión permitida, 100 más o menos. Tienes que escribir tu propia declaración if que decida cuándo detener la recursividad. Por lo general, se usa un parámetro de profundidad para detener la recursividad, algo así como (no probado y sin sentido ...)
f = function({depth}, if(depth < 10, /* do something */ f(depth + 1) ) );
f(0)