CIAO,
come posso utilizzare la nuova funzione Where con elenchi di liste o matrici?
xs = {10, 20, 30, 50};
Where( Print(xs); xs ==10 );
xs = {[10 20], [30 50]};
Where( Print(xs); xs ==[10 20] );sul primo
xs = {10, 20, 30, 50};
v=Where( xs ==10 );
print(v);
Non sono sicuro della seconda
Il primo era inteso come esempio funzionante:)
Stampa all'interno Dove :
per mostrare che xs si riferisce effettivamente a ogni singolo elemento durante il ciclo.
[Oh! - ma spiega la semplice sintassi]
"si riferisce ad ogni singolo elemento"
... in realtà come nel secondo esempio.
Il che mi fa riflettere sul secondo risultato: xs is [10 20] , ma Where non trova la corrispondenza.

Se dovessi aggiungere un altro elemento alla tua lista, Dove si interromperà. Non riesco davvero a capire il messaggio di errore
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 altro esempio nell'indice di scripting sembra essere il più vicino a questo, ma l'utilizzo dell'indice 1 non funziona in questo caso.
@EvanMcCorkle
Se fai un semplice confronto come
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];
non ne riceverai 1, ne riceverai [1 1] (quindi uno per ogni partita). Dovresti essere in grado di convertirlo in 1 usando Tutto, ma anche a Dove non piace (sembra confrontare solo il primo elemento nella matrice?)
Names Default To Here(1);
xs = {[10 20], [30 20]};
Where(Show(xs == [10 20])); // [1 0] and [0 1]
Se provi con xs[1], funzionerà finché non aggiungerai un terzo elemento (o ne rimuoverai uno), quindi molto probabilmente sta confrontando la cosa sbagliata
Names Default To Here(1);
xs = {[10 20], [30 20]};
r = Where(
Show(xs[1] == [10 20]);
xs[1] == [10 20];
);
Alla fine, con un sacco di tentativi, errori e congetture, questo ha funzionato almeno di tanto in tanto (non sono proprio sicuro di voler creare matrici di grandi dimensioni per una maschera). Questo non è quello che ti aspetteresti da Where() per questo tipo di confronti a meno che non sia documentato correttamente
</CODE></PRE>
<P>Inoltre, farlo in questo modo sembra essere più lento rispetto al semplice utilizzo di Loc(), ma il mio test potrebbe essere imperfetto</P>
<DIV class="lia-spoiler-container"><A class="lia-spoiler-link" href="#" rel="nofollow noopener noreferrer" target="_blank">Visualizza altro...</A><NOSCRIPT>(Evidenziare da leggere)</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);
);
Grazie per le intuizioni e il trucco tramite Mask: molto più veloce di
Where( xs[0,1] ==10 & xs[0,2] ==20 );
... ma nessuna possibilità di battere Posto .
un po' sorprendente...

Ho riscontrato lo stesso errore:
Not all sequences are the same size in access or evaluation of 'Where' , Bad Argument
Questa volta si utilizza la funzione "Contiene". Lo stesso argomento funziona come previsto se utilizzato all'interno della funzione "Ottieni righe dove".
Ecco un esempio minimo:
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 funziona, r2 genererà l'errore.