L'utilisation la plus courante du langage de script JMP est l'automatisation des tâches. La deuxième utilisation la plus fréquente consiste à extraire des résultats de fenêtres JMP. C'est simple, mais malheureusement, la procédure à suivre avec un script n'est pas évidente pour les non-initiés. Nous expliquons la construction des fenêtres à l'aide d'un modèle unifié d'objets d'affichage. Nous présentons ensuite comment accéder à n'importe quel contenu dans n'importe quelle fenêtre. Enfin, nous illustrons plusieurs méthodes d'adressage alternatives.
Nous présentons ici le langage de requête XPath. Des informations de base rigoureuses sont complétées par des exemples pratiques et illustratifs développés lors de la création de scripts de tests unitaires pour JMP. Nous mettons également en lumière les outils interactifs JMP qui simplifient et rendent plus accessible l'accès au contenu JMP, ainsi que certaines bonnes pratiques. Découvrez comment tirer le meilleur parti de vos résultats JMP !
Bonjour. Je suis Mark Bailey, et je suis accompagné de ma collègue Tanya Muldon. Le titre de notre présentation est : « Je vois les résultats, mais comment les obtenir ? » Nous allons aborder une situation courante. JMP produit de nombreux résultats différents dans différentes fenêtres, et il peut arriver que vous souhaitiez automatiser votre analyse, personnaliser ou modifier l’affichage, voire extraire des informations pour des calculs ultérieurs. Cela soulève plusieurs questions : comment procéder ? Existe-t-il un moyen d’accéder à ces résultats ? Existe-t-il un outil pour m’aider ? Enfin, après près de vingt-cinq ans de programmation JMP, existe-t-il des bonnes pratiques à adopter dans ce cas ?
Avant d'aborder le cœur de notre présentation, je souhaite faire une remarque. Vous pouvez demander à JMP d'enregistrer un script pour votre plateforme à tout moment. Toutes les modifications apportées à l'affichage sont automatiquement enregistrées grâce à l'argument « Envoyer à l'affichage » du script de lancement de la plateforme. Vous pourrez ensuite exécuter ce script pour reproduire cette analyse et ses résultats.
L'argument « Envoyer à l'affichage » est un mécanisme conçu pour permettre à JMP d'enregistrer ces modifications, mais il n'est pas destiné à l'écriture de scripts. Nous allons vous présenter les techniques intégrées à JMP qui constituent de véritables bonnes pratiques.
Avant toute chose, il est important de comprendre que lorsque vous consultez une fenêtre dans JMP, vous observez en réalité deux objets qui interagissent. Le premier, appelé couche d'analyse, effectue tous les calculs. Vous interagissez avec elle via les menus contextuels, par exemple en cliquant sur un triangle pour faire un choix. Le second objet, la couche de rapport, organise et affiche les résultats de la couche d'analyse.
Vous souhaitez interagir avec la couche de rapports. Pour ce faire, nous utilisons une référence d'objet à laquelle nous pouvons envoyer un message. Cette couche de rapports possède une structure arborescente, et la référence initiale pointe vers la racine de cette arborescence. Les nœuds de chaque branche sont des boîtes d'affichage JMP. Comment localiser ou identifier la boîte d'affichage à laquelle envoyer un message ? Pour cela, nous utilisons un indice. Cet indice se trouve entre crochets, après la référence initiale de la couche de rapports. Si les boîtes d'affichage sont fortement imbriquées, il peut être nécessaire d'utiliser plusieurs indices. Il peut s'agir d'indices successifs ou d'un seul indice contenant la liste des différentes boîtes.
Votre indice peut prendre plusieurs formes : absolu, relatif ou conditionnel. Pour illustrer cela, je vais commencer par un exemple très simple. J'ouvre ici la grande table de données REST. J'envoie le message « by variant » à la table de données pour lancer l'analyse du poids en fonction de la taille. Maintenant que cette référence est enregistrée dans un objet variable, je peux lui envoyer des messages. Par exemple, j'envoie le message « fit line » avec le chiffre 1 pour activer cette analyse, et vous pouvez voir le résultat : la droite de régression linéaire (moindres carrés) en rouge.
Mais je souhaite sélectionner la zone où le graphique est affiché. Je dois donc demander à la couche d'analyse, via le message de rapport, une référence à cette zone. Je l'enregistre. Je peux maintenant ajouter un indice à cette référence ; dans ce cas, « zone 1 » est l'indice approprié. Nous y reviendrons. Ensuite, je peux envoyer le message de sélection. Voilà comment on utilise les indices.
Commençons par l'indice absolu. Dans ce cas, vous utilisez un index qui vous indique quelle branche emprunter lorsque vous parcourez la structure arborescente de toutes ces boîtes d'affichage. Supposons que je souhaite sélectionner la colonne de nombres dans le résumé du profil d'ajustement. Je commence par la racine, la référence qui m'a été fournie, et je descends les branches. De cette racine, je descends la deuxième branche, puis la première, et ainsi de suite. Enfin, j'appelle la méthode `select`.
Vous pouvez constater que cela fonctionne. Les scripts absolus sont valides et efficaces, mais ils sont très difficiles à spécifier et tout aussi difficiles à lire. Ils sont également instables. Autrement dit, ils peuvent facilement dysfonctionner en fonction de diverses circonstances : les applications ouvertes, l’ordre d’exécution des opérations et, bien sûr, les mises à jour de JMP. Nous ne les recommandons pas.
La notation relative est plus simple à spécifier et à lire. Dans ce cas, pour accéder à cette même colonne de nombres, je commence par « rapport », puis mes indices sont les suivants : je souhaite sélectionner la case de plan n° 3, la case de tableau n° 1 et la case de colonne de nombres n° 1. On visualise facilement la procédure. Le résultat est identique, mais la notation est plus robuste.
La troisième méthode consiste à utiliser le langage de requête XPath. Dans ce cas, on envoie le message XPath au rapport, qui prend un seul argument : une chaîne de caractères contenant la requête de recherche. Le résultat est identique aux deux premières méthodes, mais celle-ci est la plus robuste. De plus, c'est la plus puissante et la plus flexible. Elle renvoie la liste de toutes les correspondances et bénéficie de nombreuses fonctions et d'une logique conditionnelle propres à ce langage.
Cette diapositive présente le début du fichier XML correspondant à cette fenêtre bivariée. Il s'agit du langage de balisage extensible. Nous n'entrerons pas dans les détails, mais l'idée est qu'il s'agit d'une manière de représenter une fenêtre JMP, et le langage de requête XPath est basé sur ce modèle.
Les arborescences d'affichage de JMP, c'est-à-dire toute fenêtre de JMP, peuvent être représentées en XML. Le XML est un langage permettant d'étiqueter et de stocker des données et des attributs hiérarchiques. JMP utilise la première version de ce langage ; un document distinct, disponible en ligne, présente plus en détail le langage et propose d'autres ressources en ligne.
Ce que j'aimerais faire maintenant, c'est passer en revue quelques règles de syntaxe de base pour vous donner une idée, puis je laisserai la parole à Tanya pour qu'elle vous montre des exemples concrets de son utilisation.
XPath possède également une forme absolue, ou chemin absolu. Elle est indiquée par une simple barre oblique, suivie du nom du nœud recherché. On utilise plusieurs barres obliques pour indiquer les nœuds suivants. Cependant, cette méthode est généralement déconseillée pour l'affichage des arborescences dans JMP, car les fenêtres JMP sont dynamiques.
Une meilleure méthode consiste à utiliser un chemin relatif. Dans ce cas, deux barres obliques permettent d'identifier le premier nœud. Ce nœud peut se trouver n'importe où dans l'arborescence, suivi d'autres nœuds pour finalement atteindre la cible souhaitée. Ces nœuds n'ont pas besoin d'être adjacents, c'est-à-dire des branches successives.
La troisième ligne présente un exemple simple. La chaîne de recherche correspond à un chemin relatif visant à trouver un cadre de recherche. Elle renverra la liste de tous les nœuds contenus dans un cadre de recherche, ce qui la rend très puissante. On peut également affiner la recherche à l'aide d'un prédicat, ici, le contenu entre crochets. J'y reviendrai plus en détail, mais cela nous permet de préciser notre recherche : nous ne voulons pas tous les cadres de recherche, mais uniquement ceux qui possèdent un titre, un résumé ou un indice d'ajustement.
Dans le même esprit, nous utilisons des caractères génériques, qui nous permettent de préciser certains détails d'une recherche, mais pas tous. Je souhaite rechercher n'importe quelle boîte de plan dont le titre contient le mot « résumé ». Le titre peut être simplement « résumé » ou une expression comme « Résumé de l'ajustement ». La recherche trouvera toutes les correspondances. Nous pouvons également utiliser cette méthode pour rechercher tous les nœuds du niveau inférieur. `Outlinebox/*` renverra toutes les boîtes d'affichage contenues dans toutes les boîtes de plan.
De même, nous pouvons rechercher non seulement des nœuds, mais aussi des attributs. Ici, nous recherchons tous les attributs de toutes les boîtes de contour. Le symbole @ représente un attribut, et l'astérisque indique « n'importe lequel ».
Parlons maintenant un peu plus des prédicats. Les prédicats sont indiqués entre crochets. Ici, nous recherchons les blocs de contour ayant la valeur « summary of fit ». Mais nous pouvons aller plus loin. Sur la deuxième ligne, vous voyez la même recherche, sauf qu'à la toute fin, nous ne voulons pas tous les blocs de la colonne numérique, mais le dernier. Vous pouvez indiquer ce type d'information, comme sur la troisième ligne : nous voulons rechercher les trois premiers blocs de contour. Nous utilisons la fonction de position, et la valeur doit être inférieure à la valeur de correspondance. Il peut s'agir non seulement d'une information relative au nœud, mais aussi d'un attribut de ce nœud. Nous pourrions rechercher tous les champs de texte dont la largeur est supérieure à 10. Vous disposez de cette possibilité.
Lors de vos recherches, vous pouvez avoir besoin d'une référence à une boîte d'affichage ou d'envoyer un message. Parfois, vous souhaitez simplement récupérer la valeur ou l'attribut du nœud. Prenons un exemple : nous allons rechercher toutes les boîtes d'accès, et pour chacune d'elles, toutes les zones de texte. Au lieu de renvoyer une référence à la boîte d'affichage, nous voulons récupérer sa valeur, le texte actuel de cette zone, etc. Enfin, nous voulons connaître la largeur de toutes les zones de contour de la fenêtre.
Enfin, je voudrais aborder le concept d'axes en XPath. Les axes correspondent à ce que j'ai mentionné précédemment concernant les branches : le passage d'un nœud à l'autre et les éléments rencontrés en chemin, que l'on regarde devant, derrière ou latéralement. Dans le premier exemple, je vais rechercher tous les blocs d'axes. Au lieu de spécifier un type de nœud, les deux points indiquent que je souhaite obtenir les parents de ces blocs.
Même chose sur la deuxième ligne : nous recherchons les en-têtes de colonnes numériques contenant une somme des carrés, puis leur nœud parent, c'est-à-dire la colonne numérique elle-même. Je peux utiliser des déclarations explicites concernant cette relation. Dans le troisième exemple, je recherche, à partir de la première zone d'image, un élément enfant de type zone de texte.
Je peux procéder dans l'autre sens. C'est similaire au deuxième exemple de cette diapositive. Je recherche l'en-tête d'une zone de type « Ratio T » et je souhaite ensuite trouver le conteneur parent de cette zone d'affichage, également de type « zone de type colonne numérique ». Vous disposez d'une grande puissance et d'une grande flexibilité. Souvent, une simple chaîne de recherche suffit, mais au besoin, vous pouvez utiliser des prédicats et d'autres outils syntaxiques que j'ai mentionnés.
JMP propose des outils pour vous aider. Dans le menu Aide, recherchez « index des scripts » pour afficher les boîtes de dialogue. Vous y trouverez toutes les boîtes de dialogue disponibles, leurs protocoles associés, et vous pourrez effectuer des recherches.
De plus, un clic droit sur le triangle gris devant un cadre de contour ouvre un menu contextuel permettant de sélectionner « Afficher l'arborescence » ou « Afficher les propriétés ». Ces outils interactifs facilitent l'exploration de l'arborescence et l'affichage de ses valeurs et attributs. Ils peuvent s'avérer très utiles.
De plus, le journal d'amélioration est un excellent moyen de consulter les résultats de vos recherches et de déterminer si des modifications supplémentaires sont nécessaires. Un message JSL, « Obtenir XML », permet parfois d'examiner la représentation XML sous-jacente, ce qui peut s'avérer très utile. La fonction JSL « Obtenir le chemin d'affichage » indique, pour une boîte d'affichage cible, la forme d'indice ou le chemin XML permettant d'y faire référence.
C'est tout pour moi. Je laisse maintenant la parole à Tanya pour notre démonstration en direct.
Merci, Mark. Pour cette première étude de cas, je souhaite utiliser JSL afin d'extraire les valeurs figurant dans ce rapport. La première étape consiste à déterminer quel élément contient ces valeurs. Une solution possible est d'utiliser la méthode « Afficher les propriétés ».
L'option « Afficher les propriétés » m'indique que les valeurs moyennes sont contenues dans une colonne numérique. Ce panneau illustre la structure arborescente imbriquée dont Mark a parlé précédemment. Cette colonne numérique fait partie du tableau, lui-même contenu dans un plan, et ainsi de suite.
Vous trouverez également ici le nœud de contour de chemin de cette boîte. Voici le code JSL permettant d'obtenir la référence à la boîte de la colonne numérique nommée « mean ». Le mode par défaut est l'indexation. Vous pouvez également utiliser XPath ; JMP affichera alors le code XPath correspondant.
Une fois que vous avez déterminé quel élément stocke les informations, vous devez identifier les commandes que vous pouvez lui envoyer. L'une des solutions consiste à utiliser l'index de script. En consultant la colonne numérique, vous constaterez qu'il existe différents messages GET que vous pouvez lui envoyer. Celui que je vais utiliser ici est GET sous forme de matrice.
Je vais utiliser plusieurs méthodes pour obtenir ces informations. La première consiste à les intégrer à mon rapport. Le RPT est la couche de rapport dont Mark a parlé précédemment. Dans mon rapport, je vais repérer la première colonne de nombres et récupérer ces valeurs sous forme de matrice. Je peux voir ces valeurs dans mon journal. Si je consulte mon rapport, je constate qu'il s'agit des mêmes valeurs.
Ensuite, j'utiliserai une commande XPath pour obtenir les mêmes informations. Cette fois-ci, je chercherai le titre de l'encadré « Résumé de la variabilité des mesures ». Je chercherai ensuite la colonne numérique contenant l'en-tête « Moyenne » et je l'afficherai sous forme de matrice.
Enfin, j'utiliserai ici des indices relatifs. Dans mon rapport, je rechercherai le résumé de la variabilité des mesures et la colonne numérique intitulée « moyenne », et j'obtiendrai le résultat sous forme de matrice.
Bien que j'obtienne les mêmes résultats avec les trois méthodes, nous déconseillons la première, car elle manque de fiabilité. Si JMP venait à modifier le rapport et à ajouter une colonne de nombres, l'exécution de ce code ne donnerait plus les résultats escomptés.
Ces deux derniers exemples constituent des modifications assez importantes. L'exemple relatif que j'ai présenté en dernier est plus court que l'exemple XPath. C'est généralement le cas lorsqu'on extrait un seul élément du rapport. XPath excelle particulièrement lorsqu'on extrait plusieurs éléments simultanément ou lorsqu'on utilise des expressions génériques et des prédicats complexes, comme l'a mentionné Mark précédemment.
Prenons un exemple plus complexe. Dans cette étude de cas, nous souhaitons extraire les informations récapitulatives des limites pour les deux réponses. Nous avons deux réponses et nous voulons les informations des deux. Nous pouvons le faire en utilisant l'indexation relative avec deux colonnes.
Dans notre couche de rapport, nous pouvons rechercher les récapitulatifs des limites de poids dans le premier tableau qui apparaît en dessous, et récupérer ces informations. Nous pouvons ensuite utiliser une seconde commande pour rechercher les récapitulatifs des limites de poids dans ce même tableau et récupérer ces informations.
On peut aussi utiliser une seule commande X Graph. Dans notre couche de rapport, repérez le cadre intitulé « Créateur de graphiques de contrôle ». Il se trouve ici. Recherchez tous les tableaux qui apparaissent sous « Créateur de graphiques de contrôle » et récupérez les informations correspondantes.
En écrivant ce code, nous constatons que le journal contient beaucoup plus d'informations que prévu. Vous voyez ici les blocs de tableau qui apparaissent dans votre rapport, ainsi que des blocs de tableau invisibles. D'autres blocs de tableau font partie de ce rapport, mais nous n'avons pas encore ajouté ces informations à notre couche de rapport, comme les limites ajoutées ou le rapport Sigma. Nous pouvons ajouter certaines informations à notre instruction XPath pour plus de visibilité.
Pour chaque élément de tableau, nous souhaitons examiner l'élément lui-même ainsi que ses éléments parents afin de déterminer s'ils sont visibles ou non. Dans ce code précis, nous vérifions si la visibilité est « false », mais nous avons également une condition « not » plus haut. En fait, je cherche à identifier les éléments de tableau visibles dans le rapport. Lorsque j'exécute ce code, j'obtiens les mêmes informations qu'avec mes deux instructions précédentes. XPath m'a permis d'obtenir ces informations en une seule instruction au lieu de deux.
Pour cette étude de cas, je crée un profileur de prédiction et j'ai maximisé la désirabilité. Je souhaite récupérer les valeurs Y et X rouges présentes dans ce rapport. Comme il s'agit de valeurs d'axe et qu'elles sont toutes deux rouges, on pourrait penser qu'elles sont stockées dans le même élément. Or, ce n'est pas le cas.
On peut le constater en retournant dans la fenêtre « Afficher les propriétés ». En cliquant au bon endroit, on voit que les valeurs Y sont des zones de texte et les valeurs X des champs numériques. Commençons par travailler avec ces zones de texte. Nous allons rechercher le profileur de prédiction via XPath, puis identifier les zones de texte visibles. Là encore, nous avons dû ajouter du code pour la visibilité, car certaines zones de texte ne sont pas visibles dans notre rapport, et nous ne souhaitons pas les inclure.
En exécutant ce code, on constate qu'on obtient non seulement les valeurs rouges, mais aussi les valeurs bleues correspondant aux intervalles de confiance, car elles sont également stockées sous forme de champs texte. On peut ajouter une boucle « for » pour parcourir chaque élément et extraire uniquement les valeurs rouges (une sur trois), puis stocker ces informations dans une matrice.
Nous avons maintenant nos valeurs Y (en rouge), mais nous souhaitons également récupérer nos valeurs X (également en rouge). Celles-ci étaient stockées dans des champs numériques. Nous pouvons utiliser une expression XPath pour rechercher un profileur de prédiction dans ces champs et obtenir ces valeurs sous forme de matrice. Ces valeurs figurent dans notre journal ci-dessous.
Pour cette étude de cas, je souhaite obtenir toutes les valeurs Y de chaque ligne faisant partie de ce premier cadre (ou de ce graphique de localisation), ainsi que le diamètre moyen. En consultant les propriétés, vous constaterez qu'il est impossible d'accéder au contenu de ce cadre. Lorsque je clique ici, un cadre apparaît, mais son contenu reste invisible. J'ai besoin de savoir comment ces valeurs sont stockées dans ce cadre. Une autre méthode pour obtenir ces informations consiste à utiliser l'option « Afficher la structure arborescente ».
Dans l'onglet « Structure arborescente », je peux également observer la structure arborescente dont Mark a parlé précédemment. Dans ce cadre, je vois différents segments. Ce qui m'intéresse, ce sont les segments de ligne qui apparaissent ici. Je peux utiliser une requête XPath pour extraire tous les segments de ligne du premier cadre.
Auparavant, toutes mes expressions XPath comportaient un nœud de contour. Celle-ci n'en a pas. Ce n'est pas vraiment nécessaire dans l'outil de création de graphiques de contrôle. Tous les graphiques de cet outil apparaissent sous le contour, même en cas de réponses multiples. Par conséquent, je n'en ai pas besoin ici.
Si j'exécute ce code, je constate qu'il y a sept éléments. Je peux alors utiliser un tableau associatif pour obtenir les valeurs Y de ces éléments. Après exécution, je constate que la valeur Y de la moyenne ajoutée est de 4,2, celle de la limite inférieure ajoutée est de 4,1, et ainsi de suite.
Pour cette étude de cas, j'ai trois graphiques différents. Je souhaite uniformiser les valeurs minimales et maximales de l'axe Y de chacun d'eux et ajouter la même ligne de référence. Je dois d'abord accéder à la boîte des axes. Pour cela, j'utiliserai XPath afin de rechercher le nœud « fit group outline ». Ensuite, je rechercherai toutes les boîtes d'axes visibles.
Je vois que j'ai six axes différents. Il y a trois graphiques, chacun avec un axe X et un axe Y, ce qui fait six axes. Je vais utiliser une boucle « for » pour parcourir chacune de ces valeurs. Pour l'axe Y uniquement, je vais définir une valeur minimale, une valeur maximale et ajouter une ligne de référence. Maintenant, pour chacun de mes trois graphiques, j'ai ajouté une ligne de référence et j'ai défini les valeurs minimale et maximale à la même valeur.
Dans l'exemple suivant, je souhaite raccourcir le rapport de synthèse des capacités Sigma. Je ne veux afficher que les données jusqu'à PP, sans inclure CPM, les valeurs attendues ni les valeurs observées. Je peux le faire via XPath. Je vais envoyer une commande de contour à la couche de mon rapport afin de rechercher le rapport de synthèse des capacités Sigma.
Après avoir accédé à ce niveau du rapport, je souhaite utiliser XPath pour sélectionner les en-têtes commençant par « CPM attendu », « CPM observé » ou « CPM égal ». Une fois ces en-têtes sélectionnés, j'envoie la commande de réduction de la visibilité. Or, je constate que ces valeurs ont disparu de mon rapport. Il est important de ne pas supprimer d'éléments de votre rapport. La suppression d'éléments peut avoir des conséquences inattendues. Nous vous recommandons de réduire ou de masquer les éléments de votre rapport plutôt que de les supprimer.
Voici un dernier exemple. Dans cette étude de cas, nous avons placé la plateforme Manage Limits dans une nouvelle fenêtre et nous souhaitons supprimer le bouton d'aide. Lorsque vous créez des scripts JSL, c'est souvent pour partager vos résultats. Il est donc essentiel de vous assurer que votre script se comporte de la même manière sur votre ordinateur et sur celui de l'utilisateur.
Sous Windows et macOS, les boutons se trouvent souvent à des emplacements différents. Il ne faut jamais chercher un bouton en fonction de son emplacement dans le rapport. Il est préférable de le chercher par son nom. Je ne vais pas détailler le code du gestionnaire de fenêtres ici, mais je souhaite attirer votre attention sur cette instruction XPath. Je recherche le bouton « Aide », puis je le masque. Vous constaterez que le bouton « Aide » n'est plus visible. Je viens de cliquer dessus. Je ne veux pas le supprimer du rapport pour éviter tout problème.
Je vous ai présenté trois méthodes différentes pour extraire des valeurs du rapport. L'indexation absolue est déconseillée car elle est sensible aux modifications. Les méthodes XPath et d'indexation relative sont, quant à elles, relativement robustes. Si vous ne récupérez qu'une seule valeur du rapport, l'indexation relative est probablement plus concise et plus simple. Le code XPath est utile lorsque vous collectez plusieurs informations simultanément et si vous souhaitez effectuer des opérations complexes avec des caractères génériques, par exemple.
J'espère que ces informations vous ont été utiles et que vous êtes maintenant prêt à retourner écrire des scripts.