如何在不修改原函数f的前提下,按行将其应用到Q表生成新列?
解决Q表逐行应用函数f的'type错误问题
我明白你遇到的问题了——原函数f是为单个元素设计的,直接用update传整列的话,内部的symf和datef根本处理不了列表类型的输入,自然就触发'type错误了。好在不用改原函数,用Q原生的each运算符就能完美解决,这也是最符合Q风格的做法。
直接可用的代码实现
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 }; // 关键就是加个each运算符('),让函数逐行处理 update newcol:f'[c1;c2;c3] from t
为什么这样能行?
Q里的'(each运算符)专门用来把多参数函数逐元素映射到对应的列上。这里f'[c1;c2;c3]会自动把三个列的每一组对应元素分别传给f:
- 第一行执行
f[1;a;13:00]` - 第二行执行
f[2;b;13:01]` - 第三行执行
f[3;c;13:02]`
完全适配原函数f只处理单个元素的逻辑,不会再把整列塞给内部的symf和datef,自然就不会报错了。
验证一下结果
执行后表t会新增newcol列,最终结果如下:
c1 c2 c3 newcol ------------------- 1 a 13:00 3 2 b 13:01 6 3 c 13:02 9
内容的提问来源于stack exchange,提问作者tenticon
相关产品推荐
相关产品推荐

