Mise en place d'une boucle récursive en jslSalut,
J'ai construit un long script dans lequel un ajustement de courbe est effectué de manière itérative sur une grande table de données dont de nombreuses variables répertoriées dans 1 colonne. Cependant, à la fin du processus, certaines de ces variables ne sont pas ajustées (le processus a échoué pour une raison ou une autre). À ce stade, je crée une liste « d'échec d'ajustement » des variables qui n'ont pas été ajustées dans la précédente, je crée un sous-ensemble à partir de la table source (sélectionnez où/contient/sous-ensemble) et j'exécute à nouveau une partie du script initial (cette partie de le script est enveloppé dans une expression) sur la table du sous-ensemble (lignes sélectionnées, toutes les colonnes).
À la fin du deuxième cycle d'ajustement, une nouvelle liste d'« échec d'ajustement » est créée (généralement plus petite).
J'essaie de trouver un moyen de créer une boucle récursive dans laquelle le code rechercherait la taille de la dernière liste « échec d'ajustement » et si elle est supérieure à 0 et différente de la liste précédente « échec d'ajustement », il lancera un autre tour d'ajustement jusqu'à ce que « échec d'ajustement » = 0 ou soit identique à la liste précédente « échec d'ajustement » (pour éviter de créer une boucle infinie).
Toutes les suggestions seraient grandement appréciées.
Sébastien
Mélange et nettoyage des donnéesPersonnalisation de masseles fenêtresRe : Configurer une boucle récursive en jsl@Craige_Hales Merci beaucoup pour la suggestion. Je vais essayer cette stratégie.
Sébastien
Re : Configurer une boucle récursive en jslJe n'utiliserais pas la récursivité pour cela. Utilisez une liste de WorkToBeDone et une liste de WorkCompleted et un indicateur FoundSomething. Écrivez votre boucle quelque chose comme ceci :
good = function({ method, item),
// use the current strategy/method to test the item
// return 1 if pass, 0 if fail
);
FoundSomething = 1; // flag: are we still making progress?
strategy = 1; // maybe change the strategy after each round
while(FoundSomething,
FoundSomething = 0;
for(i = nitems(WorkToBeDone), i>=1, i -= 1, // backwards because removing items
if( good( strategy, WorkToBeDone[i] ),
insertinto(WorkCompleted, removefrom(WorkToBeDone,i));
FoundSomething = 1;
)
);
strategy += 1; // new strategy for next round
);Re : Configurer une boucle récursive en jslSalut @jthi ,
Merci pour votre contribution originale. Malheureusement, je n'ai pas réussi à transformer votre suggestion en un script réalisable.
Je joins donc une autre description de mon objectif (pas un script de fonction mais plutôt un « workflow »).
J'espère que quelqu'un pourra m'orienter dans la bonne direction.
Merci
Sébastien
names default to here(1);
clear log();
sourcefitting={"a","b","c","d","e","f"};
/*The sourcefitting list can be 1000s longs and split in batches to perform some curve fitting, parameter extraction and them summarization using a FOR loo into a master table.
The process is expected to fail on some of those batches.
The failed items are identifed/listed into the 'failedfitting" list.
At which point a recursive loop using 'processX' needs to be implemented to take care of the remaining items using a new round of batching and fitting (for some reason the 'failing' process works on smaller batches but predicting which one will failed is not possible hence the need for a recessive loop), until the 'failedfittingX' list' is either empty or is stagnating (processfitting=1) ie the process keeps on failing and running the process another round is not longer warranted.
*/
processX=expr(/* process XYZ*/ //each time the processX is run 2 list are generated "succesfittingX" and "failedfittingX" are generated
//A new list "successfittingX" is generated at the end of the recursive loop
successfitting0={"a","c","d"};
/*
successfitting1={"a","c","d","b"};
successfitting2={"a","c","d","b","e"};
successfitting3={"a","c","d","b","e","f"}*/;// or successfitting3={"a","c","d","b","e"};
successfitting=successfittingX;
//The successfittingX and the sourcefitting lists are compared and a resulting list "failedfittingX" is created:
failedfitting0={"b","e","f"};
/*
failedfitting1={"e","f"};
failedfitting2={"f"};
failedfitting3={}*/; // or failedfitting3={"f"};
failedfitting=failedfittingX;
failednb=Nitems(failedfitting);
if(failedfittingX==failedfittingX-1,progressfitting=1, progressfitting=0);
);
//The issue is about correctly defining the structure recursive loop which uses the previous list to determine wheter the process needs to keep on going or if it is completed
// the use of the function 'recurse' has been suggested
testrec=function({failednb},
if(failednb>0&processfitting=0 ,recurse( processX),show("Done"))
);
testrec(failednb);
Re : Configurer une boucle récursive en jslSalut @jthi ,
Merci pour le conseil. je vais essayer
Sébastien
Re : Configurer une boucle récursive en jslJMP fournit une récursion avec Recurse(). Je pense que vous pouvez également rappeler la même fonction pour la rendre récursive
Utiliser recurse() :
Names Default To Here(1);
ex rev = Function({s},
If(Length(s) <= 1,
s,
Recurse(Substr(s, 2)) || Left(s, 1)
)
);
ex rev("abcd");
Appel de la même fonction :
Names Default To Here(1);
ex rev = Function({s},
If(Length(s) <= 1,
s,
ex rev(Substr(s, 2)) || Left(s, 1)
)
);
ex rev("abcd");