[KDB+/Q]: применять список функций к данным последовательно (конвейер)
В kdb+/q, как передать данные через последовательный список функций, чтобы вывод предыдущего шага был входом для следующего шага?
Например:
q)t:([]sym:`a`c`b;val:1 3 2)
q)`sym xkey `sym xasc t / how to achieve the same result as this?
Я предполагаю, что некоторые изменения over
или же /
может работать:
?? over (xasc;xkey)
Бонус: как добиться того же, где t
вводится с правой стороны (в духе чтения слева направо синтаксиса q)?
(xasc;xkey) ?? t
2 ответа
Решение
Используйте лямбду слева, а также наречие (форма рекурсии). Кроме того, точка применения (.) Применяется для применения функции к таблице и столбцу:
{.[y;(z;x)]}/[t;(xasc;xkey);`sym]
sym| val
---| ---
a | 1
b | 2
c | 3
Как передать данные через последовательный список функций, чтобы вывод предыдущего шага был входом следующего шага?
Вы можете использовать малоизвестный оператор композиции. Например:
q)f:('[;])over(2+;3*;neg)
q)f 1 # 2+3*neg 1
-1
Если вы хотите использовать синтаксис слева направо, вам нужно определить свой собственный глагол:
q).q.bonus:{(('[;])over x)y}
q)(2+;3*;neg)bonus 1
-1