Kdb q-在表上按行应用函数

Kdb q-在表上按行应用函数,kdb,q-lang,Kdb,Q Lang,给定一个表和一个函数 t:([] c1:1 2 3; c2:`a`b`c; c3:13:00 13:01 13:02) f:{[int;sym;date] symf:{$[x=`a;1;x=`b;2;3]}; datef:{$[x=13:00;1;x=13:01;2;3]}; r:int + symf[sym] + datef[date]; r }; 我注意到,当将函数f应用于t的列时,整个列被传递到f中,如果它们可以原子操作,那么输出将与输入具有相同的长度

给定一个表和一个函数

t:([] c1:1 2 3; c2:`a`b`c; c3:13:00 13:01 13:02)
f:{[int;sym;date] 
    symf:{$[x=`a;1;x=`b;2;3]};
    datef:{$[x=13:00;1;x=13:01;2;3]};
    r:int + symf[sym] + datef[date];
    r
 };
我注意到,当将函数
f
应用于
t
的列时,整个列被传递到
f
中,如果它们可以原子操作,那么输出将与输入具有相同的长度,并生成一个新列。但是,在我们的示例中,这不起作用:

update newcol:f[c1;c2;c3] from t / 'type error
因为内部函数
symf
datef
不能分别应用于整个列
c2
c3

如果我根本不想更改函数f,我如何逐行应用它并将值收集到
t
中的新列中

做这件事最有风格的方式是什么

编辑

如果不更改
f
确实不方便,可以这样解决

f:{[arglist]
    int:arglist 0;
    sym:arglist 1;
    date:arglist 2; 
    symf:{$[x=`a;1;x=`b;2;3]};
    datef:{$[x=13:00;1;x=13:01;2;3]};
    r:int + symf[sym] + datef[date];
    r
 };

f each (t`c1),'(t`c2),'(t`c3)
我仍然对如何在使用原始版本的
f

谢谢

您可以为此使用,例如

q)update newcol:f'[c1;c2;c3] from t
c1 c2 c3    newcol
------------------
1  a  13:00 3
2  b  13:01 6
3  c  13:02 9
但是,通过将f修改为“矢量化”,您可能会获得更好的性能,例如

一般来说,在KDB中,如果您可以避免使用任何形式的每种操作并坚持使用向量操作,您将获得更高的效率

q)update newcol:f'[c1;c2;c3] from t
c1 c2 c3    newcol
------------------
1  a  13:00 3
2  b  13:01 6
3  c  13:02 9
但是,通过将f修改为“矢量化”,您可能会获得更好的性能,例如

一般来说,在KDB中,如果您可以避免使用任何形式的每种操作,并坚持使用向量操作,那么您将获得更高的效率