考虑以下具有起始值f:{[x] ..}
的{{1}}程序:
a:0
和x
执行某些操作。输出保存为a
的新版本,输出由函数a
,请重做该过程,但现在使用新的x
。对于单个值a
,此过程很容易构建。例如:
x
但是,如何使这样的功能在应用于表格列时也能正常工作?
我无法如何将这个步骤合并到一个变量的中间保存'在一个可以立即应用于列的函数中。这有什么特别的技巧吗?例如。当我在上面的示例中使用表格列时,它只会为a:0;
f:{[x] a::a+x; :a} / A simple example (actual function more complicated)
计算所有行的a+x
,而不是在每次迭代时更新a:0
。
答案 0 :(得分:4)
无需为此使用全局变量 - 可以使用scan
- 请参阅here。
示例 -
生成表格 -
q)t:0N!([] time:5?.z.p; sym:5?`3; price:5?100f; size:5?10000)
time sym price size
-----------------------------------------------
2002.04.04D18:06:07.889113280 cmj 29.07093 3994
2007.05.21D04:26:13.021438816 llm 7.347808 496
2010.10.30D10:15:14.157553088 obp 31.59526 1728
2005.11.01D21:15:54.022395584 dhc 34.10485 5486
2005.03.06D21:05:07.403334368 mho 86.17972 2318
使用简单累加器的示例 - 注意,如果需要,该函数可以访问其他参数(参见下一个示例):
q)update someCol:{[a;x;y;z] (a+1)}\[0;time;price;size] from t
time sym price size someCol
-------------------------------------------------------
2002.04.04D18:06:07.889113280 cmj 29.07093 3994 1
2007.05.21D04:26:13.021438816 llm 7.347808 496 2
2010.10.30D10:15:14.157553088 obp 31.59526 1728 3
2005.11.01D21:15:54.022395584 dhc 34.10485 5486 4
2005.03.06D21:05:07.403334368 mho 86.17972 2318 5
说你想获得累积大小:
q)update cuSize:{[a;x;y;z] (a+z)}\[0;time;price;size] from t
time sym price size cuSize
------------------------------------------------------
2002.04.04D18:06:07.889113280 cmj 29.07093 3994 3994
2007.05.21D04:26:13.021438816 llm 7.347808 496 4490
2010.10.30D10:15:14.157553088 obp 31.59526 1728 6218
2005.11.01D21:15:54.022395584 dhc 34.10485 5486 11704
2005.03.06D21:05:07.403334368 mho 86.17972 2318 14022
如果您希望通过扫描传递多个var,可以通过为其提供更复杂的结构,将更多值打包到第一个var中:
q)update cuPriceAndSize:{[a;x;y;z] (a[0]+y;a[1]+z)}\[0 0;time;price;size] from t
time sym price size cuPriceAndSize
--------------------------------------------------------------
2002.04.04D18:06:07.889113280 cmj 29.07093 3994 29.07093 3994
2007.05.21D04:26:13.021438816 llm 7.347808 496 36.41874 4490
2010.10.30D10:15:14.157553088 obp 31.59526 1728 68.014 6218
2005.11.01D21:15:54.022395584 dhc 34.10485 5486 102.1188 11704
2005.03.06D21:05:07.403334368 mho 86.17972 2318 188.2986 14022
答案 1 :(得分:1)
@MdSalih解决方案是正确的,我只是在这里解释一下,在你的案例和解决方案中可能出现全局变量的可能原因。
q) t:([]id: 1 2)
q)a:1
我想你可能一直在使用它:
q) select k:{x:x+a;a::a+1;:x} id from t
输出:
k
--
1
2
a
值为2,表示只执行一次函数。原因是我们将完整的id
列列表传递给函数,而(+
)是原子的,这意味着它一次在完整列表上运行。在下面的前。 2将添加到列表中的所有项目。
q) 2 + (1;3;5)
使用它的正确方法是'each':
q)select k:{x:x+a;a::a+1;:x} each id from t
输出:
k
--
2
3