使用 over 副词对 table 进行操作
Using over adverb to operate on a table
给定一个二元函数 f 作为参数:
x:A 键控 table
y: 表示要创建的行的键值
并假设更新操作需要 运行 串行(不是批量操作),一旦该键被填充,我们将忽略它的进一步更新:
q)tbl:([col1:()];col2:())
q)kv:10?`a`b`c`d
q)f:{[x;y]if[y in key[x];:x];x upsert (y;1?10)}
q)(f/)[enlist[tbl],kv]
col1| col2
----| ----
a | 9
b | 2
c | 1
d | 8
有没有更正确的构造调用的方法?将两个输入混合到一个输入列表中感觉有点像 hack,并引发了关于如何容纳超过 2 个参数的函数的问题。
这需要一个小调整:
q)(f/)[tbl;kv]
KX wiki (https://code.kx.com/wiki/Reference/Slash)
对此进行了介绍
/ - f/[y] is equivalent to f[f[..f[f[y0;y1];y2];..yn-1];yn]
q)+/[1 2 3]
6
q)(f/)[enlist[tbl],kv] /joining both arguments to a single list
/ - f/[x;y] is equivalent to f[f[..f[f[x;y0];y1];..yn-1];yn]
q)+/[10;1 2 3]
16
q)(f/)[tbl;kv] / here we are passing the table as first argument
也许 运行 对不同输入的更新更有效?
(tbl upsert)/[flip(d;(count d:distinct kv)?10)]
给定一个二元函数 f 作为参数:
x:A 键控 table
y: 表示要创建的行的键值
并假设更新操作需要 运行 串行(不是批量操作),一旦该键被填充,我们将忽略它的进一步更新:
q)tbl:([col1:()];col2:())
q)kv:10?`a`b`c`d
q)f:{[x;y]if[y in key[x];:x];x upsert (y;1?10)}
q)(f/)[enlist[tbl],kv]
col1| col2
----| ----
a | 9
b | 2
c | 1
d | 8
有没有更正确的构造调用的方法?将两个输入混合到一个输入列表中感觉有点像 hack,并引发了关于如何容纳超过 2 个参数的函数的问题。
这需要一个小调整:
q)(f/)[tbl;kv]
KX wiki (https://code.kx.com/wiki/Reference/Slash)
对此进行了介绍/ - f/[y] is equivalent to f[f[..f[f[y0;y1];y2];..yn-1];yn]
q)+/[1 2 3]
6
q)(f/)[enlist[tbl],kv] /joining both arguments to a single list
/ - f/[x;y] is equivalent to f[f[..f[f[x;y0];y1];..yn-1];yn]
q)+/[10;1 2 3]
16
q)(f/)[tbl;kv] / here we are passing the table as first argument
也许 运行 对不同输入的更新更有效?
(tbl upsert)/[flip(d;(count d:distinct kv)?10)]