你好,
如何將新的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 將會拋出錯誤。