Как использовать проекцию для цикла без использования глобальных переменных?

#kdb

Вопрос:

Существует функция-оболочка, и я хотел бы использовать эту функцию для продолжения удаления, но я думаю, что она работает только для записи.

Вот функции:

 testFunc1:{
tab:([]a:`1`1`3`1`2;b:2 4 6 8 10);
tab2:update rowNumber:i from tab;
filter:select from tab2 where a = `1;
if [ ((count filter) > 0); tab2:raze .rm.tab[;tab2;filter] each til count filter];
tab:delete rowNumber from tab2;
tab
}

.rm.tab:{[x;tab;filter]
row:exec rowNumber[x] from filter;
if[(count tab) > 0; newTab: delete from tab where i = row];
:newTab
 }
 

Идея состоит tab в testFunc1 том, чтобы ввести и вернуть его, как .rm.tab при удалении записей по одной. Я думаю , что есть ошибка .rm.tab , если только одна запись работает нормально, но если в фильтре для зацикливания есть 4 записи, вывод будет возвращен четыре раза.

Не знаете, как я могу исправить .rm.tab это без использования глобальных переменных?

Комментарии:

1. Можете ли вы поделиться тем, от чего вы ожидали ожидаемого результата testFunc1[] ?

2. таким образом, он удалит все записи, которые a=`1, из номера строки. и выведите остальное. что я думаю о решении, так это tab2:distinct raze .rm.tab[;tab2;фильтр] каждый фильтр до подсчета], но сначала выводится, а затем отчетливо. интересно, есть ли лучшее решение для зацикливания — сохраните каждый результат для зацикливания

3. Необходимо ли зацикливание? Вы могли бы просто иметь .rm.tab[;tab2;filter]til count filter , а затем изменить if[(count tab)>0;newTab:delete from tab where any i=/:row] в .rm.tab

4. Почему это не так просто, как delete from tab where a=`1 кажется ?

5. фильтр-это просто пример, он будет сравниваться с чем-то другим в моей функции

Ответ №1:

Это то, что вы ищете? Я удалил each то, откуда .rm.tab вызывается и используется /: (каждый справа) внутри .rm.tab .

код

 testFunc1:{
  tab:([]a:`1`1`3`1`2;b:2 4 6 8 10);
  tab2:update rowNumber:i from tab;
  filter:select from tab2 where a=`1;
  if[(count filter)>0;tab2:.rm.tab[;tab2;filter]til count filter];
  :delete rowNumber from tab2;
 }

.rm.tab:{[x;tab;filter]
  row:exec rowNumber[x]from filter;
  if[(count tab)>0;newTab:delete from tab where any i=/:row];
  :newTab;
 }
 

Результат

 q)testFunc1[]
a b
----
3 6
2 10