Hola,
¿Cómo puedo utilizar la nueva función Where con listas de listas o matrices?
xs = {10, 20, 30, 50};
Where( Print(xs); xs ==10 );
xs = {[10 20], [30 50]};
Where( Print(xs); xs ==[10 20] );en el primero
xs = {10, 20, 30, 50};
v=Where( xs ==10 );
print(v);
No estoy seguro del segundo
El primero pretendía ser un ejemplo práctico.:)
Imprimir dentro Dónde :
para mostrar que xs de hecho se refiere a cada elemento individual durante el ciclo.
[¡Guau! - pero explica la sintaxis sencilla]
"se refiere a cada elemento individual"
... en realidad como en el segundo ejemplo.
Lo que me hace preguntarme sobre el segundo resultado: xs es [10 20] , pero Where no encuentra la coincidencia.

Si agregara un elemento más a su lista, Where se rompería. Realmente no puedo entender el mensaje de error.
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];
);
Otro ejemplo en el Índice de secuencias de comandos parece ser el más cercano a este, pero usar el índice 1 realmente no funciona en este caso.
@EvanMcCorkle
Si haces una comparación simple como
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];
No recuperarás 1, recuperarás [1 1] (es decir, uno por cada partido). Debería poder convertir esto a 1 usando Todo, pero a Where tampoco le gusta (¿parece que solo compara el primer elemento de la matriz?)
Names Default To Here(1);
xs = {[10 20], [30 20]};
Where(Show(xs == [10 20])); // [1 0] and [0 1]
Si intenta con xs[1], funcionará hasta que agregue un tercer elemento (o elimine uno), por lo que lo más probable es que esté comparando algo incorrecto.
Names Default To Here(1);
xs = {[10 20], [30 20]};
r = Where(
Show(xs[1] == [10 20]);
xs[1] == [10 20];
);
Finalmente, con muchas pruebas, errores y conjeturas, esto funcionó al menos de vez en cuando (no estoy seguro de si desea crear matrices grandes para una máscara). Esto no es lo que se esperaría de Where() para este tipo de comparaciones a menos que esté documentado adecuadamente.
</CODE></PRE>
<P>Además, hacerlo de esta manera parece ser más lento que simplemente usar Loc() pero mi prueba podría ser defectuosa.</P>
<DIV class="lia-spoiler-container"><A class="lia-spoiler-link" href="#" rel="nofollow noopener noreferrer" target="_blank">Ver más...</A><NOSCRIPT>(Resaltar para leer)</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);
);
Gracias por los consejos y el truco a través de Mask: mucho más rápido que
Where( xs[0,1] ==10 & xs[0,2] ==20 );
... pero no hay posibilidad de vencer a Loc .
Un poco sorprendente...

Me encontré con el mismo error:
Not all sequences are the same size in access or evaluation of 'Where' , Bad Argument
Esta vez, al usar la función "Contiene", el mismo argumento funciona correctamente dentro de la función "Obtener filas donde".
He aquí un ejemplo mínimo:
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 funciona, r2 arrojará el error.