Aide au script pour Table Box() dans une List Box()Salut tout le monde,
J'essaie d'écrire du code JSL qui prend les données d'une table de données et les affiche graphiquement pour que l'utilisateur puisse choisir pour une analyse plus approfondie. Ce que j'aimerais obtenir, c'est quelque chose comme un mélange entre le rapport Eigenvalue de la plate-forme PCA et le rapport Effect Summary de la plate-forme Fit Model. J'aimerais que le visuel ressemble au rapport PCA, mais la fonctionnalité (c'est-à-dire la possibilité de sélectionner une ligne) du rapport Résumé des effets.
Rapport PCA Eigenvalue (à quoi je veux qu'il ressemble):

Fit Model Effect Summary rapport (la fonctionnalité que j'aimerais). Dans cette plate-forme, on peut sélectionner une ligne dans la zone de liste () et choisir de "supprimer" ou "ajouter". Je ne veux pas supprimer ou ajouter, mais je veux que l'utilisateur puisse sélectionner la ligne (à partir de la sortie ci-dessus):

J'ai joint la table de données avec laquelle je travaille, c'est la "Current Data Table()" dans le code JSL ci-dessous. Le code JSL ci-dessous peut me faire partie du chemin, mais pas exactement ce que je veux.
Names Default To Here( 1 );
PC_dt = Current Data Table();
PC_n = {};
PC_eigv = {};
PC_per = {};
PC_cump = {};
For( i = 1, i <= N Rows( PC_dt ), i++,
Insert Into( PC_n, PC_dt:"Number"n[i] );
Insert Into( PC_eigv, Round( PC_dt:"Eigenvalue"n[i], 5 ) );
Insert Into( PC_per, Round( PC_dt:"Percent"n[i], 5 ) );
Insert Into( PC_cump, Round( PC_dt:"cumulative Percent"n[i], 5 ) );
);
PC_Rpt_win = New Window( "PC Results",
Outline Box( "Eigenvalues & cumulative Percent",
//List Box(
//List Box(
Table Box(
Number Col Box( "Number", Eval List( PC_n ) ),
Number Col Box( "Eigenvalue", Eval List( PC_eigv ), <<SET format=""></SET>
Avec les sections commentées, j'obtiens la sortie suivante du code (aucune ligne n'est sélectionnable, cependant):

Je ne sais vraiment pas si j'ai besoin de toute la partie de la boîte pré-Outline du code où je génère des listes pour les PC et les valeurs propres, etc. Mais, cela semblait être la façon logique de le faire puisque je traite avec des colonnes dans une table de données et les fonctions nécessitent des listes. Cela fonctionne, même si ce n'est pas nécessaire.
</CODE></P><P> </P><P>Si j'inclus l'un ou les deux appels de List Box() commentés autour de Table Box(), j'obtiens ce qui suit. Les lignes sont sélectionnables, mais rien ne s'affiche :</P><P><SPAN class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="DiedrichSchmidt_3-1635336043749.png" style="width: 400px;"><SPAN class="lia-inline-image-display-wrapper" image-alt="DiedrichSchmidt_3-1635336043749.png" style="width: 221px;"><span class="lia-inline-image-display-wrapper" image-alt="DiedrichSchmidt_3-1635336043749.png" style="width: 221px;"><img src="https://us.v-cdn.net/6038925/uploads/images/37045iA319787974999980/DiedrichSchmidt_3-1635336043749.png" role="button" title="DiedrichSchmidt_3-1635336043749.png" alt="DiedrichSchmidt_3-1635336043749.png" /></span></SPAN></SPAN></P><P>Je ne suis pas sûr de ce que je fais de mal, et l'index de script contient des exemples limités d'utilisation correcte de l'appel List Box() avec un Table Box(). J'ai essayé de suivre l'arborescence de la fenêtre de rapport de la plateforme Fit Model, mais cela ne fonctionne pas.</P><P> </P><P>En résumé, j'aimerais corriger les éléments suivants dans mon script :</P><OL><LI>Corrigez la Plot Col Box afin qu'elle ait la courbe de pourcentage cumulée comme le montre le rapport PC (première image ci-dessus). Ce n'est pas aussi critique que le point 2.</LI><LI>Corrigez l'appel de List Box() autour de Table Box() afin que l'utilisateur puisse sélectionner une ligne dans la List Box qui sera ensuite envoyée à une autre fonction pour une analyse plus approfondie.</LI></OL><P>Merci pour toute suggestion et aide!,</P><P>DS</P></LINGO-BODY><LINGO-LABS id="lingo-labs-430708" slang="en-US" mode="NONE"><LINGO-LABEL>Automatisation et script</LINGO-LABEL><LINGO-LABEL>Personnalisation de masse</LINGO-LABEL></LINGO-LABS><LINGO-SUB id="lingo-sub-431611" slang="en-US" mode="NONE">Re : Aide au script pour la zone de table () dans une zone de liste ()</LINGO-SUB><LINGO-BODY id="lingo-body-431611" slang="en-US" mode="NONE"><P>Voici une autre façon d'obtenir des données à partir de tableaux dans un rapport et le T2 à partir d'un rapport PLS :</P>
<P> </P>
<PRE><CODE class=" language-jsl">Names default to here(1);
dt = Open("$Sample_data/Quality Control/Chemical Reactor Process.jmp");
pls = dt << Run Script("Fit PLS (Pro Only)");
//get values for the first column with the name R²Y by searching for display elements that have a
//child header box containing specific values
(pls << XPath("//NumberColBox[NumberColBoxHeader[text()='R²Y']]"))[1] << get as matrix;
//generalize this into a function and then call it for others column headers
getColumn = function({c},(pls << XPath("//NumberColBox[NumberColBoxHeader[text()='" || c || "']]"))[1] << get as matrix);
getColumn("Q²");
getColumn("Y Responses");
//To get T2, you need to send the message to a specific fit within the platform. As Mark mentioned this is tricky because you
//need to send the message to the analysis layer (I've been calling it a scriptable object), but to find the right object you
//navigate the report structure. I like Xpath, so here is how I would get the report (implied with the XPath function),
//navigate to the outline box (picks the first one matching a name), get the scriptable object or analysis layer and then
//send the message to save T2.
firstfit = (((pls << XPath("//OutlineBox[contains(text(),'NIPALS Fit with ')]"))[1]) << Get Scriptable Object) << Save T Square();
firstfit << Save T Square;
//This might better illustrate what is happening
show properties( report(pls)[Outline Box( "Partial Least Squares" )][Outline Box( "NIPALS Fit with 6 Factors Using Fast SVD" )] << get scriptable object );
Re : Aide au script pour la zone de table () dans une zone de liste ()Ce problème découle d'un point commun de confusion. Une plate-forme JMP est composée d'une couche d'analyse et d'une couche de rapport. La couche d'analyse est responsable du calcul et répond aux commandes présentées dans les menus du triangle rouge. La couche rapport est responsable de la présentation des informations. La couche de rapport est une structure imbriquée de zones d'affichage. Vous devez envoyer le message Save T Square à la couche d'analyse, pas à la couche de rapport. La référence à la couche d'analyse est celle qui est renvoyée au lancement de la plateforme. Par exemple,
biv = Current Data Table() << Bivariate( Y( :weight ), X( :height ), Fit Line );
La variable biv stocke une référence à la plateforme ou plus précisément à la couche d'analyse. Vous obtenez alors une référence à la couche de rapport associée avec un autre message.
bivRep = biv << Report;
J'espère que cette explication clarifie votre question.
Re : Aide au script pour la zone de table () dans une zone de liste ()Salut @jthi ,
Merci encore pour vos retours rapides et votre aide. Oui, le <
Maintenant, mon seul problème est de savoir comment économiser T². Chaque fois que j'essaie d'adresser la boîte de contour en question à partir de la plate-forme PCA, j'obtiens une erreur de journal indiquant que la boîte d'affichage ne reconnaît pas <
Merci!,
DS
Re : Aide au script pour la zone de table () dans une zone de liste ()Pour l'article 1 :
Je suppose qu'il existe une autre / meilleure façon de procéder, mais j'ai trouvé les messages << Lower et << Upper (nécessite que Lower soit spécifié). Avec << Lower, vous pouvez obtenir les premières valeurs de la colonne cumulative, puis les définir sur Plot Col Box with Lower
pcb << Lower(ncb << get as matrix);

Avec votre code, cela ressemblerait à ceci (ajoutez des références et utilisez-les):
Voir plus... Pour obtenir des valeurs :
Parfois, il peut suffire d'utiliser Make into data table (selon la plate-forme et si vous utilisez By variable):

puis en vérifiant à partir de la table résultante le script de table :


Parfois, cela donne un moyen assez rapide d'obtenir des références pour corriger les boîtes d'affichage.
Re : Aide au script pour la zone de table () dans une zone de liste ()Salut @jthi ,
Eh bien, oubliez la partie sur DModX, l'index de script m'a montré comment faire cela et cela fonctionne comme prévu. Il a un exemple pour Save T Square, mais cela ne fonctionne pas. Je vais continuer. Je pense que je dois faire référence à la bonne boîte de contour.
Merci!,
DS
Re : Aide au script pour la zone de table () dans une zone de liste ()Salut @jthi ,
Merci pour vos commentaires rapides. J'avais essayé cela plus tôt, mais rien ne s'était passé, alors je l'ai abandonné pour un autre itinéraire, mais il ne menait nulle part. Je suis retourné et j'ai essayé, et ça marche, merci! La fonctionnalité ajoutée est utile. Cela a définitivement résolu le point 2, qui était le plus important. S'il y a une idée de comment réparer l'élément 1, ce serait formidable, mais pas essentiel.
Ceci est lié, mais peut-être un autre fil (faites-le moi savoir et je le republierai comme un autre fil).
Savez-vous utiliser JSL pour enregistrer les valeurs DModX et T² de la plateforme PCA dans la table de données ? Tout cela est pour essayer d'automatiser ce processus, ou au moins supprimer plusieurs des autres étapes et donner simplement à l'utilisateur les bases pour décider du nombre de PC à utiliser ensuite pour enregistrer les formules DModX et T².
Merci!,
DS
Re : Aide au script pour la zone de table () dans une zone de liste ()Existe-t-il un besoin spécifique pour List Box() ? Vous pouvez utiliser << Définir les lignes sélectionnables (); pour rendre les lignes sélectionnables dans la zone de table, puis utilisez << définir la fonction de changement de ligne (Fonction ({this}, ); pour ajouter une fonction à la sélection.
Exemple tiré de l'index de script :
Names Default To Here(1);
New Window("Mountains",
tb = Table Box(
String Col Box("Mountain", {"K2", "Delphi", "Kilimanjaro", "Grand Teton"}),
Number Col Box("Elevation (meters)", {8611, 681, 5895, 4199}),
Plot Col Box("", {8611, 681, 5895, 4199})
)
);
tb << Set Selectable Rows();
tb << set row change function(Function({this}, Print(this << get selected rows)));