Salut,
comment puis-je utiliser la nouvelle fonction Where avec des listes de listes ou de matrices ?
xs = {10, 20, 30, 50};
Where( Print(xs); xs ==10 );
xs = {[10 20], [30 50]};
Where( Print(xs); xs ==[10 20] );sur le premier
xs = {10, 20, 30, 50};
v=Where( xs ==10 );
print(v);
je ne suis pas sûr du deuxième
Le premier était destiné à servir d'exemple de travail:)
Imprimer à l'intérieur Où :
pour montrer que xs fait effectivement référence à chaque élément individuel pendant la boucle.
[Ouah! - mais explique la syntaxe simple]
"fait référence à chaque élément individuel"
... en fait comme dans le deuxième exemple.
Ce qui me fait m'interroger sur le deuxième résultat - xs est [10 20] , mais Where ne trouve pas la correspondance.

Si vous deviez ajouter un élément supplémentaire à votre liste, Where se brisera. Je n'arrive pas vraiment à comprendre le message d'erreur
Not all sequences are the same size in access or evaluation of 'Where' , Bad Argument(
Print(xs);
xs == [10 20];
), Where/*###*/(Print(xs) ; xs == [10 20])
Names Default To Here(1);
xs = {[10 20], [30 50], [10 20]};
Where(
Print(xs);
xs == [10 20];
);
Un autre exemple dans l'index de script semble être le plus proche de celui-ci, mais l'utilisation de l'index 1 ne fonctionne pas vraiment dans ce cas.
@EvanMcCorkle
Si vous faites une comparaison simple comme
Names Default To Here(1);
xs = {[10 20], [30 50], [10 20]};
mask = Repeat(Eval List({[10 20]}), N Items(xs));
xs[1] == mask[1];
vous ne récupérerez pas 1, vous récupérerez [1 1] (donc un pour chaque match). Vous devriez pouvoir convertir cela en 1 en utilisant All, mais Where n'aime pas ça non plus (il semble comparer uniquement le premier élément de la matrice ?)
Names Default To Here(1);
xs = {[10 20], [30 20]};
Where(Show(xs == [10 20])); // [1 0] and [0 1]
Si vous essayez avec xs[1], cela fonctionnera jusqu'à ce que vous ajoutiez un troisième élément (ou en supprimiez un), il est donc très probable qu'il s'agisse d'une mauvaise comparaison.
Names Default To Here(1);
xs = {[10 20], [30 20]};
r = Where(
Show(xs[1] == [10 20]);
xs[1] == [10 20];
);
Enfin, avec beaucoup d'essais, d'erreurs et de suppositions, cela a fonctionné au moins de temps en temps (je ne sais pas vraiment si vous souhaitez créer de grandes matrices pour un masque). Ce n’est pas ce que vous attendez de Where() pour ce type de comparaison, à moins qu’il ne soit correctement documenté.
</CODE></PRE>
<P>Le faire de cette façon semble également être plus lent que d'utiliser simplement Loc() mais mon test pourrait être erroné</P>
<DIV class="lia-spoiler-container"><A class="lia-spoiler-link" href="#" rel="nofollow noopener noreferrer" target="_blank">Voir plus...</A><NOSCRIPT>(Surligner pour lire)</NOSCRIPT><DIV class="lia-spoiler-border"><DIV class="lia-spoiler-content">
<PRE><CODE class=" language-jsl">Names Default To Here(1);
testitems = 300;
//xs = {[10 20], [30 20], [10 20]};
xs = Repeat({[10 20]}, testitems / 3);
xs = xs || Repeat({[30 20]}, testitems / 3);
xs = xs || Repeat({[1 2]}, testitems / 3);
xs = xs[Random Shuffle(1::testitems)];
testcount = 10000;
where_speed = Repeat({.}, testcount);
loc_speed = Repeat({.}, testcount);
matches = Repeat({.}, testcount);
category = Repeat({""}, testcount);
expr1 = Expr(
wait(0);
a = HP Time();
mask = Repeat(Eval List({[10 20]}), N Items(xs));
r1 = Where(All(xs == mask));
wait(0);
b = HP Time();
);
expr2 = Expr(
wait(0);
c = HP Time();
r2 = Loc(xs, [10 20]);
wait(0);
d = HP Time();
);
For(i = 1, i <= testcount, i++,
wait(0);
If(Random Integer(1, 2) == 2,
expr2;
expr1;
cur_cat = "Loc";
,
expr1;
expr2;
cur_cat = "Where";
);
where_speed[i] = b - a;
loc_speed[i] = d - c;
category[i] = "Loc";
matches[i] = Try(All(r1 == r2), 0);
wait(0);
);
dt = New Table("Test",
Add Rows(testcount),
New Column("Row", Numeric, Ordinal, Formula(Row())),
New Column("Locs", Numeric, Continuous, Values(loc_speed)),
New Column("Where", Numeric, Continuous, Values(where_speed)),
New Column("Matches", Numeric, Nominal, Values(matches)),
New Column("Category", Character, Nominal, Values(category))
);
tab = dt << Tabulate(
Show Control Panel(0),
Add Table(
Column Table(Analysis Columns(:Locs, :Where)),
Row Table(
Grouping Columns(:Category),
Statistics(Mean, Median, Std Dev, Interquartile Range)
)
)
);Names Default To Here(1);
xs = {[10 20], [30 20], [10 20]};
mask = Repeat(Eval List({[10 20]}), N Items(xs));
r = Where(
//show(xs, mask, xs == mask, All(xs == mask));
All(xs == mask);
);
Merci pour les informations et l'astuce via Mask - beaucoup plus rapide que
Where( xs[0,1] ==10 & xs[0,2] ==20 );
... mais aucune chance de battre Lieu .
un peu surprenant...

J'ai rencontré la même erreur :
Not all sequences are the same size in access or evaluation of 'Where' , Bad Argument
Cette fois, lors de l'utilisation de la fonction « Contient », le même argument fonctionne comme prévu lorsqu'il est utilisé dans la fonction « Obtenir les lignes où ».
Voici un exemple minimal :
Names Default To Here( 1 );
dt = Open( "$SAMPLE_DATA/Big Class.jmp" );
names = {"KATIE", "JAMES"};
r1 = dt << Get Rows Where( Contains(names, :name) );
r2 = Where( Contains(names, :name) );
Show( r1, r2 );
r1 fonctionne, r2 renverra l'erreur.