Hallo,
wie kann ich die neue Where-Funktion mit Listen von Listen oder Matrizen verwenden?
xs = {10, 20, 30, 50};
Where( Print(xs); xs ==10 );
xs = {[10 20], [30 50]};
Where( Print(xs); xs ==[10 20] );auf dem ersten
xs = {10, 20, 30, 50};
v=Where( xs ==10 );
print(v);
Beim zweiten bin ich mir nicht sicher
Das erste war als Arbeitsbeispiel gedacht:)
Innen aufdrucken Wo :
um zu zeigen, dass sich xs während der Schleife tatsächlich auf jedes einzelne Element bezieht.
[wow! - aber erklärt die einfache Syntax]
„bezieht sich auf jedes einzelne Element“
... eigentlich wie im zweiten Beispiel.
Was mich über das zweite Ergebnis wundern lässt - xs ist [10 20] , aber Where findet die Entsprechung nicht.

Wenn Sie Ihrer Liste ein weiteres Element hinzufügen, wird Where abgebrochen. Ich kann die Fehlermeldung nicht wirklich verstehen.
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];
);
Ein anderes Beispiel im Skriptindex scheint dem am nächsten zu kommen, aber die Verwendung von Index 1 funktioniert in diesem Fall nicht wirklich.
@EvanMcCorkle
Wenn Sie einen einfachen Vergleich anstellen wie
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];
Sie erhalten nicht 1 zurück, sondern [1 1] (also eins für jede Übereinstimmung). Sie sollten dies mit All in 1 umwandeln können, aber Where gefällt das auch nicht (es scheint nur das erste Element in der Matrix zu vergleichen?)
Names Default To Here(1);
xs = {[10 20], [30 20]};
Where(Show(xs == [10 20])); // [1 0] and [0 1]
Wenn Sie es mit xs[1] versuchen, funktioniert es, bis Sie ein drittes Element hinzufügen (oder eines entfernen). Daher wird höchstwahrscheinlich das Falsche verglichen.
Names Default To Here(1);
xs = {[10 20], [30 20]};
r = Where(
Show(xs[1] == [10 20]);
xs[1] == [10 20];
);
Nach viel Ausprobieren und Rätselraten hat es schließlich zumindest von Zeit zu Zeit funktioniert (ich bin mir nicht sicher, ob Sie große Matrizen für eine Maske erstellen möchten). Das ist nicht das, was Sie von Where() für diese Art von Vergleichen erwarten würden, es sei denn, es ist richtig dokumentiert.
</CODE></PRE>
<P>Außerdem scheint es auf diese Weise langsamer zu sein, als nur Loc() zu verwenden, aber mein Test könnte fehlerhaft sein</P>
<DIV class="lia-spoiler-container"><A class="lia-spoiler-link" href="#" rel="nofollow noopener noreferrer" target="_blank">Mehr sehen...</A><NOSCRIPT>(Zum Lesen markieren)</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);
);
Danke für die Einblicke und den Trick über Mask - viel schneller als
Where( xs[0,1] ==10 & xs[0,2] ==20 );
... aber keine Chance, Ort zu schlagen.
irgendwie überraschend ...

Bin auf den gleichen Fehler gestoßen:
Not all sequences are the same size in access or evaluation of 'Where' , Bad Argument
Diesmal bei Verwendung der Funktion „Enthält“. Dasselbe Argument funktioniert wie erwartet, wenn es innerhalb der Funktion „Zeilen abrufen, wo“ verwendet wird.
Hier ist ein Minimalbeispiel:
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 funktioniert, r2 wird den Fehler ausgeben.