L'indexation dans une matrice (ou une liste) avec une autre matrice (ou liste) est une technique puissante pour rendre les scripts rapides et petits, mais il y a un cas limite à craindre que nous corrigeons pour JMP 13. Je devrais peut-être mettre "réparation" entre guillemets car tout changement est une perturbation potentielle, c'est pourquoi je veux l'expliquer ici avant JMP 13.
Voici un exemple d'utilisation d'une matrice comme index dans une colonne de données.
Open("$SAMPLE_DATA/Big Class.jmp");
tall rows = Loc(:height << Get Values() >= 67); // [25, 27, 30, 37, 39, 40]
:height[tall rows]; // [68, 69, 67, 68, 68, 70]
N Rows(:height[tall rows]); // 6
Si vous n'êtes pas familier avec ce style de programmation, la deuxième ligne est la clé. " :hauteur << Obtenir les valeurs() " renvoie les valeurs de la colonne de hauteur sous forme de matrice. La comparaison " >= 67 " renvoie une matrice de 0 et de 1 correspondant à l'endroit où l'expression est fausse (0) ou vraie (1). Le Loc() La fonction renvoie les emplacements des 1 dans la matrice précédente.
Dans ce cas, nous obtenons [25, 27, 30, 37, 39, 40] comme numéros de ligne où la colonne de hauteur est supérieure ou égale à 67. C'est assez pratique en soi, mais le vrai pouvoir vient de la possibilité d'utiliser cette matrice comme index dans une colonne ou une autre matrice comme dans les troisième et quatrième lignes.
L'alternative à cette technique serait d'écrire une boucle For() pour parcourir explicitement chaque ligne. Bien sûr, JMP parcourt toujours les lignes dans les deux cas, mais c'est beaucoup plus rapide s'il est fait en interne plutôt qu'en JSL. Et le JSL est plus compact sans la boucle explicite.
Nous pouvons faire la même chose avec une variable de matrice au lieu d'une référence de colonne de données :
m = :height << Get Values();
tall rows = Loc(m >= 67); // [25, 27, 30, 37, 39, 40]
m[tall rows]; // [68, 69, 67, 68, 68, 70]
N Rows(m[tall rows]); // 6
Tout va bien jusqu'à présent. Regardons les mêmes exemples avec un seuil de hauteur différent (70 au lieu de 67) :
tall rows = Loc(:height << Get Values() >= 70); // [40]
:height[tall rows]; // [70]
N Rows(:height[tall rows]); // 1
m = :height << Get Values();
tall rows = Loc(m >= 70); // [40]
m[tall rows]; // 70
N Rows(m[tall rows]); // error
Qu'est ce qui ne s'est pas bien passé? Notez que data[tall rows] a renvoyé 70 au lieu de [70]. Dans de nombreux cas, une matrice 1x1 et un nombre sont traités de la même manière, mais pas toujours. La fonction N Rows() est un exemple où cela fait une différence. L'indexation "simplifie" trop agressivement la matrice 1x1 en un nombre.
Une solution consiste à appeler Est Matrice() avant d'utiliser N lignes() . Une autre consiste à concaténer une matrice vide au résultat, ce qui créera une matrice, que la source soit un nombre ou une matrice :
m = m |/ [];
Dans JMP 13, la matrice 1x1 est conservée de sorte que le résultat de l'opération d'indexation sera une matrice chaque fois que l'index lui-même est une matrice . Il en va de même pour l'indexation des listes et déjà appliqué à l'indexation des colonnes de données.
Nous nous attendons à ce que la perturbation soit rare car le déclencheur n'est pas commun et une matrice 1x1 et un nombre sont souvent traités de la même manière de toute façon. Néanmoins, le débogueur JMP 13 aura la capacité d'identifier les endroits de vos scripts qui pourraient être affectés par la modification.
Si vous avez des commentaires ou des préoccupations, faites-le nous savoir ici ou contactez danielvalente pour voir si vous êtes éligible au programme JMP 13 Early Adopter afin d'essayer la modification sur votre propre code.
Comment puis-je désactiver l'avertissement d'interruption pour cela dans le débogueur ?Je dois continuer à cliquer sur jouer encore et encore et il semble que le profileur ne fonctionne pas.Ça coince et je ne peux plus appuyer sur play.
*MODIFIER* C'est pas grave.J'ai trouvé l'option pour cela.Merci
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />Je suis d'accord, c'est bien d'avoir une indexation uniforme.J'aime le fait que l'on puisse créer des matrices vides avec une forme.
Grande amélioration. Voici une autre suggestion pour les matrices : simplifiez l'indexation lorsque vous utilisez une condition. Ceci est mieux expliqué par un exemple. Disons que j'ai une matrice que je veux trouver et renvoyer les valeurs supérieures à 5 :
mymatrix = [2,4,6,8,10];
newmatrix=mymatrix[loc(mymatrix>5)];
Comparez ceci à un code similaire dans R :
mymatrix = matrix(cbind(2,4,6,8,10));
newmatrix=mymatrix[mymatrix>5];
OK, la première instruction dans R est plus longue et la deuxième instruction renvoie un vecteur plutôt qu'une matrice, mais la deuxième instruction est plus courte. Ce serait bien si JMP pouvait implémenter la syntaxe plus simple dans la deuxième instruction dans les futures versions.
Je conviens que la nouvelle gestion de la matrice à valeur unique est une amélioration, mais j'appuie également la demande de Mark Bailey pour l'élimination de la sortie déroutante de la matrice vide [] (0,1). Le remplacer par [] serait plus facile à comprendre et à gérer pour l'utilisateur. J'utilise habituellement une logique telle que la suivante pour gérer cette situation :
dt=current data table();
rows_to_capture=dt<<GET rows="" where=""></GET>
Il distingue différentes matrices vides de dimension non nulle ; parfois la forme est importante :
show(x00,nrows(x00),ncols(x00));
show(x10,nrows(x10),ncols(x10));
show(x01,nrows(x01),ncols(x01));
show(x11,nrows(x11),ncols(x11));
x00 = [];
N Rows(x00) = 0;
N Cols(x00) = 0;
x10 = [](1, 0);
N Rows(x10) = 1;
N Cols(x10) = 0;
x01 = [](0, 1);
N Rows(x01) = 0;
N Cols(x01) = 1;
x11 = [1];
N Rows(x11) = 1;
N Cols(x11) = 1;
Nous avons un cas dans notre cours de script avancé où le résultat est la matrice vide mais ce qui est réellement renvoyé est [](0,1) ..Cette forme semble anodine (c'est-à-dire qu'elle se comporte comme une simple matrice vide) mais elle nécessitait toujours une explication. Que fait le (0,1) représenter et comment serait-il utilisé? S'il ne représente rien ou ne sert à rien, veuillez envisager de le supprimer.
J'ai beaucoup de code en place qui doit gérer cette exception.C'est une nette amélioration.Merci pour la mise en garde, je vais jeter un œil à son impact sur le modèle de code actuel que j'ai utilisé pour gérer cette situation.
J'apprécie la tête haute ....... c'est la bonne direction .....
C'est un grand pas dans la bonne direction.