从q中的表调用函数及其参数

时间:2019-02-06 16:25:56

标签: kdb

我正在尝试从表中调用函数及其参数。所以我通过以下方式调用该函数:

(first exec function from table where id=jobId)

在此示例中,我得到:+

然后我将参数称为:

[first exec args from table where id=jobId]

以我为例[2 2]

将两行依次运行为:

`(first exec func from table where id=jobId)[first exec args from .table where id=jobId]`

请给我:+ [2 2]

但是我需要:+ [2; 2]。

我正在从文档中阅读此声明,但无法完全实现。

”     exec(?[;;;])的功能形式的参数必须以解析形式传递,并根据所需结果在特定的数据结构中传递。 “

我试图将参数部分的传递转换为如下所示的函数调用:

?[table;jobId=id;args;()]

4 个答案:

答案 0 :(得分:5)

要涵盖具有单个输入,多个输入等功能的一般情况,您需要类似以下内容:

q)t:([]func:({x+1};floor;{x+y};first;{x+100});args:(12;1.5;2 2;"abc";`foo))

q)t
func    args
-------------
{x+1}   12
_:      1.5
{x+y}   2 2
*:      "abc"
{x+100} `foo

q)update res:{.[x;(),y;@[x;y;]`$]}'[func;args] from t
func    args  res
-------------------
{x+1}   12    13
_:      1.5   1
{x+y}   2 2   4
*:      "abc" "a"
{x+100} `foo  `type

答案 1 :(得分:4)

要从表中调用函数和参数,可以使用.应用,如下所示:

    q)table:([] function:+;args:enlist 2 2;id:1)

    q)table
    function args id
    ----------------
    +        2 2  1
    q)exec .[first function;first args] from table where id=1
    4

希望这会有所帮助。

答案 2 :(得分:1)

如果您要对参数执行函数,则可以直接在select / exec语句中执行。

q) exec function .' args from table where id=1 

答案 3 :(得分:1)

我想你的桌子看起来像这样

q)show table:([] function:(+;*;{x+2*y}); args:(2 2;9 7;1 3); id:0 1 2)
function args id
----------------
+        2 2  0
*        9 7  1
{x+2*y}  1 3  2

拥有函数和参数后,可以使用.(apply)进行应用:

q)jobId:1
q)(first exec function from table where id=jobId) . first exec args from table where id=jobId
63

如果您使用'(each-both)副词,则可以将上面的查询简化为仅执行一次:

q)first exec function .' args from table where id=1
63

如果删除上面的where子句,则可以得到将每个函数应用于每个参数的结果:

q)update result:function .' args from table
function args id result
-----------------------
+        2 2  0  4
*        9 7  1  63
{x+2*y}  1 3  2  7