你好,
如何将新的 Where 函数与列表或矩阵列表一起使用?
xs = {10, 20, 30, 50};
Where( Print(xs); xs ==10 );
xs = {[10 20], [30 50]};
Where( Print(xs); xs ==[10 20] );第一个
xs = {10, 20, 30, 50};
v=Where( xs ==10 );
print(v);
我不确定第二个
第一个是作为工作示例:)
打印在里面哪里:
表明xs确实在循环过程中引用了每个单独的元素。
[哇!- 但解释了简单的语法]
“指代每个单独的元素”
...实际上就像第二个例子一样。
这让我对第二个结果感到疑惑 - xs是[10 20] ,但是Where没有找到匹配。

如果你再向列表中添加一项,Where 就会中断。我真的无法理解错误消息
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];
);
脚本索引中的其他示例似乎与此最接近,但在这种情况下使用索引 1 实际上不起作用。
@EvanMcCorkle
如果你做一个简单的比较
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];
您不会得到 1,您将得到 [1 1](因此每匹配一次)。您应该能够使用 All 将其转换为 1,但 Where 也不喜欢这样(它似乎只比较矩阵中的第一个项目?)
Names Default To Here(1);
xs = {[10 20], [30 20]};
Where(Show(xs == [10 20])); // [1 0] and [0 1]
如果你尝试使用 xs[1],它会一直工作,直到你添加第三个项目(或删除一个),所以很可能它比较的是错误的东西
Names Default To Here(1);
xs = {[10 20], [30 20]};
r = Where(
Show(xs[1] == [10 20]);
xs[1] == [10 20];
);
最后,经过大量的尝试、错误和猜测,这种方法至少偶尔会奏效(不太确定是否要为掩码创建大型矩阵)。除非有适当的文档记录,否则您不会期望 Where() 能够用于此类比较
</CODE></PRE>
<P>这样做似乎比直接使用 Loc() 更慢,但我的测试可能有缺陷</P>
<DIV class="lia-spoiler-container"><A class="lia-spoiler-link" href="#" rel="nofollow noopener noreferrer" target="_blank">查看更多...</A><NOSCRIPT>(突出显示以阅读)</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);
);
感谢通过 Mask 提供的见解和技巧 - 比
Where( xs[0,1] ==10 & xs[0,2] ==20 );
...但没有机会击败地方 。
有点令人惊讶...

遇到了同样的错误:
Not all sequences are the same size in access or evaluation of 'Where' , Bad Argument
这次使用“Contains”函数时。在“Get Rows Where”函数中使用相同的参数时,效果与预期一致。
这是一个最小的例子:
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 有效,r2 将会抛出错误。