Salut,
Grâce aux autres utilisateurs du forum, j'ai un script fonctionnel qui inclut des sélecteurs de colonnes et des filtres de données locaux. Le script fonctionne comme prévu et je souhaite maintenant l'intégrer à un module complémentaire pour mes clients. Je pense avoir les détails du fonctionnement du module complémentaire et pouvoir lancer le script. Il effectue l'importation, le nettoyage et la synthèse des données, puis crée l'interface. Cependant, l'interface génère des erreurs lorsque j'exécute le sélecteur de colonnes, ce qui fonctionnait correctement si je lançais le script seul. Si je clique sur un nouvel élément dans le sélecteur de colonnes, j'obtiens l'erreur suivante : j'ai joint le code qui crée cette vue. Dans mon code, je l'attache à une table de données récapitulatives, puis je l'exécute depuis le script. Si je l'exécute via le module complémentaire (où je viens de joindre le script), une erreur se produit. Si je ferme ensuite cette fenêtre et que je clique sur le bouton « Créer le même affichage », le résultat est correct. Je ne sais donc pas quoi modifier et quelles sont mes idées ?
Andy

cell_sum << new script(
"Main Interface",
cell_sum = Current Data Table();
test = Fit Group(
Oneway(
Y( :Max Discharge Capacity ),
X( :Cathode Recipe.x ),
Quantiles( 1 ),
Means( 1 ),
Box Plots( 1 ),
Mean Diamonds( 0 ),
X Axis Proportional( 0 ),
Points Jittered( 1 ),
Grand Mean( 0 ),
),
Oneway(
Y( :"Cycle Number (>0.8)"n ),
X( :Cathode Recipe.x ),
Quantiles( 1 ),
Means( 1 ),
Box Plots( 1 ),
Mean Diamonds( 0 ),
X Axis Proportional( 0 ),
Points Jittered( 1 ),
Grand Mean( 0 ),
),
Oneway(
Y( :"Discharge Capacity @ 50 Cycles"n ),
X( :Cathode Recipe.x ),
Quantiles( 1 ),
Means( 1 ),
Box Plots( 1 ),
Mean Diamonds( 0 ),
X Axis Proportional( 0 ),
Points Jittered( 1 ),
Grand Mean( 0 ),
),
Oneway(
Y( :"Remain % @ 50 Cycles"n ),
X( :Cathode Recipe.x ),
Quantiles( 1 ),
Means( 1 ),
Box Plots( 1 ),
Mean Diamonds( 0 ),
X Axis Proportional( 0 ),
Points Jittered( 1 ),
Grand Mean( 0 ),
),
<<{Arrange in Rows( 4 )}
);
colpick = test << Column Switcher(
:Cathode Recipe.x,
cell_sum << get column names( Ordinal, Nominal )
);
(test << top parent)[listboxbox( 1 )] << set script(
Try( test << remove local data filter );
mycurrent = ((test << top parent)[listboxbox( 1 )] << get selected)[1];
test << Local Data Filter(
Add Filter( columns( Column( mycurrent ) ), Display( Column( mycurrent ), N Items( 15 ), Find( Set Text( "" ) ) ) )
);
);
test << Local Data Filter(
Add Filter( columns( colpick << get current ), Display( colpick << get current, N Items( 15 ), Find( Set Text( "" ) ) ) )
);
);
cell_sum << run script( "Main Interface" );
Salut,
Merci beaucoup pour votre description complète de ce qui se passait et l'explication des espaces de noms.
Je n'ai vraiment pas compris ce qu'était vraiment "Names Default to Here (1)". Appris quelque chose de nouveau.
Merci encore.
Andy
JSL est différent de nombreux autres langages de programmation en ce sens qu'il ne contrôle pas automatiquement la portée comme, par exemple, Python pourrait le faire.Dans ce cas, vous utilisez la ligne
(test << top parent)[listboxbox( 1 )] << set script(... pour ajouter un script à la zone de liste.Lorsque ce script s'exécute (par l'utilisateur sélectionnant un élément), alors toute variable dans ce script doit être résolue -- c'est là que la portée entre en jeu.En Python, chaque fonction a une portée locale et chaque portée est consciente de sa portée parente et de la portée globale (et les portées sont persistantes), de sorte qu'une variable dans une fonction peut accéder aux variables de la portée parente ou de la portée globale.JSL ne fait pas cela - les fonctions ne créent pas et ne se souviennent pas des portées et toute portée créée ne conserve pas d'enregistrement de la portée qui l'a créée.Pour JSL, lorsqu'une variable non délimitée est accessible (soit par espace de noms:variable ou As Scoped( namespace, variable ) alors il ira par défaut à la Ici ou portée mondiale et c'est tout.
La recherche de portée pour les noms sans portée ressemble à ceci : Regardez l'espace de noms local s'il existe (si vous êtes dans un Local( {}, ... ) fonction ou Fonction( {}, {Local par défaut}, ... ) fonction sont les plus courants), regardez le Ici espace de noms (s'il existe), regardez l'espace de noms global.Parfois, il examine les noms de colonne (comme dans un Pour chaque ligne() fonction).
Dans votre fichier, vous n'utilisez aucun raccourci de portée automatique (tel que Noms par défaut ici (1) ), de sorte que chaque variable a une portée globale.Ainsi, lorsque le Zone de liste le script s'exécute, il peut trouver test parce qu'il regarde dans la portée globale.Cependant, les scripts addin utilisent par défaut le Noms par défaut ici (1) fonction que ce soit ou non c'est dans le fichier de script.Dans ce périmètre, les fichiers Ici l'espace de noms est supprimé une fois le script terminé, et le Zone de liste le script ne trouve pas test dans n'importe quelle étendue à laquelle il a accès (c'est-à-dire, son propre Ici l'espace de noms et l'espace de noms global).Vous pouvez désactiver le Noms par défaut ici (1) dans la version addin, mais je déconseille cela et il est préférable de contrôler explicitement la portée.
Cela dit, pour désactiver le Noms par défaut ici (1) dans la version addin, décochez la case suivante :
