J'ai une formule qui est récurrente.JMP peut le résoudre, mais il met en garde contre les cycles à chaque fois que je crée une nouvelle formule.
Comment puis-je:
- Forcer une nouvelle itération ?
- Configurer le nombre d'itérations (ou critères d'arrêt) pour résoudre la récurrence ?
- Empêcher l'évaluation de se reproduire ? Supprimer l'option Eval dans le menu de formule, n'a pas fonctionné.
La fonction est un peu plus complexe mais pas différente de la suivante, qui fonctionne sans rechigner.
X (k+1) = 0,99 * X(k)
If(
Selected() == 1, 1,
Row() == 1, 1,
Lag( :X ) * 0.99
)
L'évaluateur de formules de JMP fonctionne en évaluant d'abord les colonnes de formules qui ne dépendent que des colonnes sans formule, puis en évaluant les colonnes de formules qui dépendent des colonnes de formules déjà évaluées. Si la formule de la colonne A dépend de la colonne B et que la formule de la colonne B dépend de la colonne A, JMP ne peut pas choisir laquelle évaluer en premier. Si vous parvenez à amener JMP à créer une dépendance circulaire, vous ne pouvez pas savoir quelle colonne utilisait les anciennes données de l'autre colonne.
JMP évalue une colonne de haut en bas. Dans une formule, vous pouvez utiliser la fonction de décalage (ou l'indexation) pour examiner les lignes précédentes et obtenir la valeur précédemment calculée. Je ne sais pas ce qui se passe si vous regardez les lignes futures, mais cette valeur n'a pas encore été calculée.
Il existe des formules qui pourraient fonctionner sur la base des règles Excel, mais JMP n'est pas une feuille de calcul et joue selon les règles ci-dessus. Si vous devez faire en sorte que la colonne A fasse référence à un décalage de la colonne B et que la colonne B fasse référence à un décalage de la colonne A, vous devez faire en sorte que A et B soient des colonnes sans formule et écrire JSL pour les remplir. Ajoutez ce JSL à un script de table avec un nom tel que « Exécutez-moi lorsque les données doivent être mises à jour ».
Si vous avez une fonction récursive, vous pouvez créer une fonction JSL qui s'appelle elle-même. JSL a une limite assez basse sur la profondeur de récursivité autorisée, environ 100. Vous devez écrire votre propre instruction if qui décide quand arrêter la récursivité. Typiquement, un paramètre de profondeur est utilisé pour arrêter la récursivité, quelque chose comme (non testé et inutile...)
f = function({depth}, if(depth < 10, /* do something */ f(depth + 1) ) );
f(0)