Partie du script qui ne s'exécute que si elle est exécutée après coupJ'utilise une partie du script pour recoder les colonnes de ma table afin de modifier les valeurs de "X" à 0. J'ai fait fonctionner cette partie du code (Merci les forums de discussion JMP !!) lorsqu'elle est exécutée séparément de mon script principal. Cependant, lorsque j'insère ceci dans un script plus volumineux (même à la toute fin), JMP n'exécute pas ma commande. Lorsque le code a été placé au milieu de mon script, tout ce qui a suivi ne s'est pas exécuté... je l'ai donc déplacé au bas de mon script principal mais il ne s'exécute toujours pas. Chaque fois que je mets en évidence cette partie et que je l'exécute après coup, elle fait exactement ce que je veux.
J'ai essayé d'implémenter wait(0);, en passant de i à k et en utilisant également une instruction Try autour de For Each Row, mais sans succès. Je me demande vraiment pourquoi cela ne fonctionnerait qu'après coup. Suggestions?
//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 ) ) );
Modélisation statistique avancéeAutomatisation et scriptsMélange et nettoyage des donnéesConception d'expériencesPersonnalisation de masseRe : Une partie du script ne s'exécute que si elle est exécutée après coupSalut,
Je ne sais pas pourquoi le code que j'ai fourni ne fonctionne pas pour vous. Vous pouvez essayer ce qui suit :
1) Exécutez le code original que j'ai fourni, seul, dans une nouvelle fenêtre. Est-ce que ça marche? Si non, quelle version de JMP utilisez-vous ? L'indexation directe des tables de données a été ajoutée il y a quelques versions, mais ne figure pas dans JMP 12, par exemple.
2) En supposant que 1) ci-dessus fonctionne, l'étape suivante consiste à remplacer toutes les instances de "dt" par "yields", à exécuter le nouveau code seul dans la nouvelle fenêtre. Cela a fonctionné pour moi et je m'attends à ce que cela fonctionne pour vous si 1) a fonctionné pour vous.
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 les données de votre tableau sont basées sur des formules, les formules peuvent avoir été "écrites" dans la colonne, mais leur évaluation n'est peut-être pas terminée au moment où le JSL destiné à corriger les éléments manquants commence à s'exécuter. Assurez-vous que toutes les formules sont complètement mises à jour, avant l'exécution du code, en faisant précéder le code de cette ligne :
Yields << run formulas;
4) Assurez-vous que "Rendements" ne fait référence à rien d'autre que la table de données qui vous intéresse... pas un nom de colonne, un autre nom de variable, une variable de table, etc. Pour cette raison, comme meilleure pratique, je recommande d'utiliser "dt" quelque part dans n'importe quel nom de variable utilisé pour pointer vers une table ; bien qu'il soit facile d'envisager d'écraser un descripteur de table "Rendements" en nommant par inadvertance une matrice ou un vecteur de valeurs "Rendements", il est beaucoup moins probable de nommer accidentellement une telle matrice ou un tel vecteur "YieldDt". Cependant, étant donné que votre programme fonctionne si vous suspendez l'exécution, je ne pense pas que ce soit le problème.
Si 1) et 2) fonctionnent pour vous et que ni 3) ni 4) ne résolvent le problème, j'aurai besoin de plus d'informations pour vous aider : un exemple de table nettoyée et un extrait de code qui peut être exécuté sur cette table pour montrer que le le remplacement ne fonctionne pas sur cette table.
Acclamations,
Brady
Re : Une partie du script ne s'exécute que si elle est exécutée après coupSalut Mark. Cela fonctionne séparément maintenant mais ne fonctionne pas comme une partie plus petite de mon script plus vaste. Je me demande s'il s'agit moins d'un problème de script que d'un autre problème. Pourquoi une section de code fonctionnerait-elle lorsqu'elle serait exécutée seule plutôt qu'échouerait-elle lorsqu'elle serait exécutée en tant que partie plus petite d'un script plus grand (même lorsqu'elle serait exécutée en dernier comme ce serait le cas dans le premier scénario) ?Re : Une partie du script ne s'exécute que si elle est exécutée après coupBonjour Brady,
J'apprécie tous les conseils et l'aide. Cependant, cette section de code que vous avez fournie ne semble pas fonctionner pour moi (après avoir modifié le nom de la table). Je trouve cela très étrange – je ne vois aucune raison pour que cela ne fonctionne pas. Des idées?
For( i = 1, i <= N Col( Yields ), i++,
Yields[Loc( Is Missing( Yields[0, i] ) ), i] = 0
);
Pour reformuler un peu ma question : le code que j'ai actuellement fonctionne lorsqu'il est exécuté séparément, mais pas lorsqu'il est exécuté comme une petite section d'un code plus grand . Je trouve cela étrange en soi. Je suis d'accord pour changer mon code, c'est juste que pour moi, cela ne semble pas être le problème - parce que (bien que pas "parfait") ça marche ! Cela pourrait-il être un bug ? Ou existe-t-il des moyens de résoudre ce problème ? Je n'ai pas non plus d'erreurs lors du débogage.
Re : Une partie du script ne s'exécute que si elle est exécutée après coupDe plus, si vous avez plusieurs lignes ou colonnes, liez nrows (dt) ou ncols (dt) à une variable et utilisez-la comme index supérieur, donc nrow(dt) ou ncol(dt) n'a pas besoin d'être évalué à chaque itération.
//do some stuff
);nc = ncol (dt);
for (i = 1, i<=nc, i++,
JMP 16 vous permet de faire cela avec une boucle for each(), à ne pas confondre avec for each row(). For Each() présente d'autres avantages par rapport aux boucles for() de base, comme la portée locale des variables et une exécution plus rapide dans certains cas. Si vous utilisez JMP 16, assurez-vous de le vérifier.
for each ( { i }, 1::nrow( dt ),
//do some stuff
);
Re : Une partie du script ne s'exécute que si elle est exécutée après coupAussi, permettez-moi d'être le premier à admettre que je n'utilise jamais For Each Row().
Jamais.
Pas même si les enfants mangent gratuitement.
Si je dois parcourir les lignes (ce que j'essaie d'éviter, en récupérant les valeurs d'une colonne d'un seul coup, soit en indexant directement comme nous le faisons dans cet exemple, en utilisant << obtenir les valeurs et en exploitant la liste ou la matrice résultante, etc.) , J'écris une boucle for ( ) appropriée.
Je ne dis pas que For Each Row() ne fonctionne jamais. Je dis que cela comporte des réserves, et je ne sais pas quelles sont ces réserves. J'évite donc For Each Row ( ) comme la peste et recommande aux autres de faire de même, à moins qu'ils ne soient tous les deux prêts à apprendre les mises en garde et 2) soient prêts à supposer que ceux qui modifient, maintiennent ou interagissent d'une autre manière avec le code dans l’avenir fera de même.
Ce dernier est si improbable que je n’ai jamais envisagé d’entreprendre le premier.
Acclamations,
Brady
for (i =1, i<=nrow(dt), i++,
//do some stuff
);
Re : Une partie du script ne s'exécute que si elle est exécutée après coupSalut,
Si les performances sur les grandes tables sont un problème, vous souhaiterez peut-être essayer ce qui suit (remarque, j'ai utilisé dt comme nom de table). Sur une table modérée (100 000 lignes x 5 colonnes), la différence de performances est perceptible sur ma machine, à 0,0056 seconde contre 0,8261 seconde. Cela est dû à plusieurs raisons :
Premièrement, les fonctions Loc() et Is Missing() sont rapides, même lorsqu'elles sont utilisées sur une colonne entière à la fois, ce que nous faisons ici. Autrement dit, dt[0, i] récupère l'intégralité de la colonne i.
De plus, en indexant directement les colonnes, nous n'avons pas besoin d'obtenir leurs noms ou de les récupérer dans la liste les contenant.
Acclamations,
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 : Une partie du script ne s'exécute que si elle est exécutée après coup//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 : Une partie du script ne s'exécute que si elle est exécutée après coupJe viens de l'essayer. Cela ne fonctionne pas, même lorsqu'il est exécuté séparément. Le script original que j'ai fonctionne, mais uniquement lorsqu'il est exécuté séparément (après coup, une fois que tout le script est exécuté et que j'ai Ctrl+R cette section).Re : Une partie du script ne s'exécute que si elle est exécutée après coup//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 ) )
);